我目前正致力于一个快速动态框架,该框架将用于Objective-c应用程序。
我创建了这个方法(签名):
public init(buttons: ActionButton...) {
///code
}
但是,此方法永远不会从使用框架的objective-c应用程序访问(可见)。添加时
@objc
在方法声明xcode前面给出了错误
“方法无法标记为@objc,因为它具有可变参数”
因此,如果我理解正确,swift可变参数不能暴露给目标c。因此我要问的问题是: 有没有其他方法(CVArgList?)来获得相同的功能?
我知道我可以使用数组,但我不想使用这个功能。
感谢。
答案 0 :(得分:8)
您可以将C中的可变参数函数桥接到Swift,而不是另一个方向。有关详情,请参阅Using Swift with Cocoa and Objective-C:Interacting with C APIs:Variadic Functions。
但这并不难以手工实施。只需创建方法的数组版本并将所有可变形式传递给它。首先在斯威夫特:
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