【问题标题】:Expose swift variadic parameter to Objective-C将 swift 可变参数公开给 Objective-C
【发布时间】:2016-07-01 13:09:13
【问题描述】:

我目前正在开发一个用于 Objective-c 应用程序的 swift 动态框架。

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

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

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

@objc

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

“方法不能被标记为@objc,因为它有可变参数”

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

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

谢谢。

【问题讨论】:

  • 您是否尝试过在 Objective-c 中创建一个可变参数函数并查看编译器如何将其桥接到 swift?
  • @Feldur ObjC 带有可变参数的函数不会被编译器桥接到 Swift。
  • @matt 我剩下的问题是我想知道是否有办法公开我不知道的可变参数。如果没有办法,那么这就是我的问题的答案,我将使用数组。但是,如果有办法,那么我很想听听。不知道为什么我被否决了,如果问题不清楚,那么它就没有被阅读。

标签: objective-c swift


【解决方案1】:

您可以将 C 中的可变参数函数桥接到 Swift,但不能在另一个方向上桥接。有关更多信息,请参阅Using Swift with Cocoa and Objective-C:Interacting with C APIs:Variadic Functions

但这并不难手动实现。只需创建该方法的数组版本并将所有可变参数形式传递给它。 Swift 中的第一名:

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

【讨论】:

  • 恕我直言,您 (@Guus) 明确表示您不想通过传递数组来调用 Swift 方法。但这正是这里发生的事情。为什么通过精心设计的前端来做到这一点比简单地在原始调用中传递数组更好?
  • 在 Rob 的辩护中,他所做的是将数组交给 Swift 的过程抽象出来,保留了在 Objective-C 中使用可变参数接口的能力。我相信这符合 Guus 的意图,即使不是他的字面意思
  • @matt Feldur 准确地解释了我的想法。这确实不是我想做的事情,但它确实得到了我想要的结果。 (能够传递可变参数并将其转换为数组)。我说我不想使用数组的主要原因是因为我已经知道数组方法但想知道是否有更好的方法并且不想浪费任何人时间来解释我如何使用数组。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 2014-08-03
  • 1970-01-01
相关资源
最近更新 更多