我嘗試添加使用協議擴展,像這樣一些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