让我们考虑以下代码:
protocol A {
func doA()
}
extension A {
func registerForNotification() {
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardDidShow:"), name: UIKeyboardDidShowNotification, object: nil)
}
func keyboardDidShow(notification: NSNotification) {
}
}
现在看一个实现 A 的 UIViewController 子类:
class AController: UIViewController, A {
override func viewDidLoad() {
super.viewDidLoad()
self.registerForNotification()
triggerKeyboard()
}
func triggerKeyboard() {
// Some code that make key board appear
}
func doA() {
}
}
但是出乎意料的是,这会导致一个错误:
keyboardDidShow:]: 无法识别发送给实例0x7fc97adc3c60的选择器
那么我应该在视图控制器中实现观察者吗?难道它不能留在扩展中吗?
已经尝试过以下方法:
将A设置为类协议。 将keyboardDidShow作为签名添加到协议本身。
protocol A:class {
func doA()
func keyboardDidShow(notification: NSNotification)
}
extension A{}
。从Swift 2开始的新功能,叫做协议扩展。它甚至可以向协议方法添加默认功能。 - Swift Hipsterfunc keyboardDidShow(notification: NSNotification)
,与Selector("keyboardDidShow:")
匹配。 - Swift Hipster