我目前正在开发一个快速动态框架,它将用于 Objective-C 应用程序。
我创建了这个方法(签名):
public init(buttons: ActionButton...) {
///code
}
然而,这个方法永远无法从使用该框架的 Objective-C 应用程序访问(可见)。添加时
@objc
在方法声明前面 xcode 给出错误
“方法不能标记为@objc,因为它有一个可变参数”
因此,如果我理解正确,则 swift 可变参数不能暴露给 Objective C。因此我要问的问题是:
有没有其他方法(CVArgList?)来获得相同的功能?
我知道我可以使用数组,但我不想使用这个函数。
Thanks.
您可以将 C 中的可变参数函数桥接到 Swift,但不能桥接另一个方向。看将 Swift 与 Cocoa 和 Objective-C 结合使用:与 C API 交互:可变参数函数了解更多相关信息。
但这并不难手动实现。只需创建该方法的数组版本并将所有可变参数形式传递给它即可。首先是斯威夫特:
public class Test: NSObject {
convenience public init(buttons: String...) {
self.init(buttonArray: buttons)
}
public init(buttonArray: [String]) {
}
}
然后通过类别暴露给ObjC。
@interface Test (ObjC)
- (instancetype) initWithButtons:(NSString *)button, ...;
@end
@implementation Test (ObjC)
- (instancetype) initWithButtons:(NSString *)button, ... {
NSMutableArray<NSString *> *buttons = [NSMutableArray arrayWithObject:button];
va_list args;
va_start(args, button);
NSString *arg = nil;
while ((arg = va_arg(args, NSString *))) {
[buttons addObject:arg];
}
va_end(args);
return [self initWithButtonArray:buttons];
}
@end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)