在大多数情况下,Swift在类型安全方面比Objective-C有了巨大的改进。一个明显的例外是选择器。在Objective-C中,使用表达式@selector(notARealSelector:)
将给出编译器警告。 Swift等价,Selector("notARealSelector:")
将始终编译,但在运行时将失败。
是否有一种在Swift中使用选择器的类型安全方法,所以我可以使用需要它们的Objective-C API?
我的应用程序中有很多NSNotification
个观察者,并希望进行某种编译时检查,以免我的选择器中出现拼写错误。
修改:具体用例为NSNotificationCenter.addObserver
。
答案 0 :(得分:3)
Typesafe选择器刚刚在Xcode 7.3 beta 4中发布:
let sel = #selector(insertSubview(_:aboveSubview:)) // sel has type
Selector
现在是一等公民,并带有一些不错的Swift编译器警告。如果需要,你仍然可以传入一个字符串:
let sel = Selector("propertyName")
请在此处查看更完整的答案:@selector() in Swift?
Xcode发行说明:http://adcdownload.apple.com/Developer_Tools/Xcode_7.3_beta_4/Xcode_7.3_beta_4_Release_Notes.pdf
答案 1 :(得分:1)
将选项的Swift概念用作:
if let result = object.notARealSelector?(/* args */) {
// Use Result
}
如果notARealSelector
类型没有定义此类方法,那么?会在false
之后使用if
返回object
。
optional protocol requirements有一个警告:
只有标记了协议,才能指定可选的协议要求 使用@objc属性。即使您没有与Objective-C互操作, 如果要指定,则需要使用@objc属性标记协议 可选要求。
但是,既然你首先要询问可选方法,那么你必须在Objective-C语境中讨论这个问题。
答案 2 :(得分:-1)
您可以使用反射将对象属性的名称作为字符串获取,如this answer中所总结的那样,但不会在标识符与其字符串名称之间建立连接方式@selector
在ObjC中做。一些创造性地使用反射可能会解决这个问题,但您也可能会对file a bug做得很好。