我的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方面做什么来为该原型实现该功能?
答案 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中。