在Swift中使用选择器是否有类型安全的方法?

时间:2014-06-09 14:42:39

标签: selector swift type-safety

在大多数情况下,Swift在类型安全方面比Objective-C有了巨大的改进。一个明显的例外是选择器。在Objective-C中,使用表达式@selector(notARealSelector:)将给出编译器警告。 Swift等价,Selector("notARealSelector:")将始终编译,但在运行时将失败。

是否有一种在Swift中使用选择器的类型安全方法,所以我可以使用需要它们的Objective-C API?

我的应用程序中有很多NSNotification个观察者,并希望进行某种编译时检查,以免我的选择器中出现拼写错误。

修改:具体用例为NSNotificationCenter.addObserver

3 个答案:

答案 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做得很好。