【发布时间】:2014-06-09 14:42:38
【问题描述】:
在大多数情况下,就类型安全而言,Swift 比 Objective-C 有了巨大的改进。一个明显的例外是选择器。在 Objective-C 中,使用表达式 @selector(notARealSelector:) 将给出编译器警告。 Swift 等效项Selector("notARealSelector:") 将始终编译,但在运行时会失败。
在 Swift 中是否有一种类型安全的方式来使用选择器,以便我可以使用需要它们的 Objective-C API?
我的应用中有很多 NSNotification 观察者,并且希望在编译时检查我没有在我的选择器中打错字。
编辑:具体用例为NSNotificationCenter.addObserver。
【问题讨论】:
-
您能举例说明您目前如何使用
@selector()块吗?您调用这些方法的对象是否随时公开(通过协议一致性或子类化)这些方法?您可以使用myDelegate?.scrollViewDidScroll?(...),但这要求委托至少符合协议,以便编译器有机会确定该方法是否可能存在。 -
就像我在问题中所说的,
NSNotificationCenter.addObserver -
@selector 的另一个常见用途是
UIControl和子类使用的目标/动作。例如button.addTarget(self, action: "doTap", forControlEvents: .TouchUpInside)- 令人沮丧的是,由于拼写错误或方法名称更改,快速编译器无法警告错误。 -
不是对您关于使用 swift 选择器的一般类型安全的问题的具体答案,但如果您想在这种特定情况下保持类型安全,则此通知调用的一个版本改为使用块选择器的:
public func addObserverForName(name: String?, object obj: AnyObject?, queue: NSOperationQueue?, usingBlock block: (NSNotification) -> Void) -> NSObjectProtocol。见codefellows.org/blog/…
标签: selector swift type-safety