如何在Objective-c中使用可空指针参数声明/实现Swift函数?

时间:2016-01-22 01:30:45

标签: swift cocoa-touch

我的Swift代码有:

@objc protocol MyDelegate {
    func buttonPressed(buttonNum: Int, packet: Packet?)
}

然后我的代表的Objective-c代码有:

- (void)buttonPressed:(NSInteger)buttonNum :(Packet * _Nullable) packet {
}

但是我没有实现"功能未实现"警告。我的实验似乎表明这个可以为空的指针存在问题。即如果没有"?"在Swift proto声明中没有" _Nullable"在Object-c函数中,一切都很好。

有没有人知道我需要在Objective-c方面做什么来为该原型实现该功能?

1 个答案:

答案 0 :(得分:2)

问题不是由于参数的可为空性,而是由于选择器名称。

func buttonPressed(buttonNum: Int, packet: Packet?)

应该得到一个

buttonPressed:packet:

Objective-C功能。你的是buttonPressed:: - 没有第二个参数的标签。

混淆可能是由于Swift自动推断从第二个参数开始的标签 - 如果没有指定标签,则假定标签是参数名称。这就是为什么在Swift中你需要将协议函数称为buttonPressed(arg1, packet: arg2)

现在您可以将packet标签添加到Objective-C选择器,也可以将其从Swift函数声明中删除,如下所示:

func buttonPressed(buttonNum: Int, _ packet: Packet?)

然后你可以像buttonPressed(arg1, arg2)那样从Swift中调用它。这取决于你选择哪种方法,虽然我建议更明确地使用标记的方法,至少在Objective-C中。