我尝试添加使用协议扩展,像这样一些UITextFieldDelegate
的方法的默认行为:SWIFT 2.0 - UITextFieldDelegate协议扩展不工作
extension ViewController: UITextFieldDelegate {
// Works if I uncommented this so I know delegates are properly set
// func textFieldShouldReturn(textField: UITextField) -> Bool {
// textField.resignFirstResponder()
// return true
// }
}
extension UITextFieldDelegate {
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
}
正如你可能已经猜到,键盘永不解散。我看不出这里的问题在哪里。这是语言限制吗?有人已经成功做到了吗?
编辑:
由于@Logan建议,默认协议的方法实现不标记为@objc
协议工作。然而,UITextFieldDelegate
具有以下特征public protocol UITextFieldDelegate : NSObjectProtocol {...}
我已经测试默认实施NSObjectProtocol
,它似乎正常工作:
protocol Toto: NSObjectProtocol {
func randomInt() -> Int
}
extension Toto {
func randomInt() -> Int {
return 0
}
}
class Tata: NSObject, Toto {}
let int = Tata().randomInt() // returns 0
'UITextFieldDelegate'签名看起来像'公共协议UITextFieldDelegate:NSObjectProtocol {...}'。我只是测试协议的扩展来实现'NSObjectProtocol'协议,它似乎没有问题。此外,如果我试图扩展'@ obj'协议,编译器是不是应该警告我? – Yaman
@Yaman - 我们都知道编译器的警告在Swift中并不完美,有时还不清楚。如果你超越“不符合”的范围,至少在我的系统中,我还会得到一个'@ objc'警告,它会一直添加'@ objc',但从未解决问题。这个问题并没有扩展ObjC协议,对于任何混淆感到抱歉。问题是创建依赖于ObjC可访问性的默认行为。只能在Swift中访问的ObjC协议的扩展和添加方法很好。添加必须是ObjC可访问的默认实现是导致问题的原因。 – Logan
感谢这些精度。我也测试了实现'NSObjectProtocol'的协议的默认实现,并且也可以工作。是否声明'NSObjectProtocol'等价于'@ objc'标记?也许'UITextFieldDelegate'协议被隐式标记为'@ objc',但我的自定义协议实现'NSObjectProtocol'不? – Yaman