将快速变量参数暴露给Objective-C

时间:2016-07-01 13:09:13

标签: objective-c swift

我目前正致力于一个快速动态框架,该框架将用于Objective-c应用程序。

我创建了这个方法(签名):

public init(buttons: ActionButton...) {
///code
}

但是,此方法永远不会从使用框架的objective-c应用程序访问(可见)。添加时

@objc

在方法声明xcode前面给出了错误

“方法无法标记为@objc,因为它具有可变参数”

因此,如果我理解正确,swift可变参数不能暴露给目标c。因此我要问的问题是: 有没有其他方法(CVArgList?)来获得相同的功能?

我知道我可以使用数组,但我不想使用这个功能。

感谢。

1 个答案:

答案 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