Sto cercando di aggiungere un comportamento di default sui metodi un po UITextFieldDelegate
s' utilizzando le estensioni di protocollo in questo modo:rapida 2.0 - protocollo di estensione UITextFieldDelegate non funziona
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
}
}
Come si può intuire, la tastiera non respingere. Non riesco davvero a vedere dov'è il problema qui. Si tratta di una limitazione della lingua? Qualcuno lo ha già fatto?
EDIT:
Come suggerito @Logan, implementazione del metodo di protocollo predefinito non funziona con i protocolli contrassegnate come @objc
. Tuttavia, UITextFieldDelegate
ha la seguente firma public protocol UITextFieldDelegate : NSObjectProtocol {...}
Sono implementazione predefinita di prova per NSObjectProtocol
e sembra funziona bene:
protocol Toto: NSObjectProtocol {
func randomInt() -> Int
}
extension Toto {
func randomInt() -> Int {
return 0
}
}
class Tata: NSObject, Toto {}
let int = Tata().randomInt() // returns 0
La firma 'UITextFieldDelegate' si presenta come' protocollo pubblico UITextFieldDelegate: NSObjectProtocol {...} '. Ho appena testato l'estensione del protocollo per i protocolli che implementa 'NSObjectProtocol' e sembra non essere problematico. Inoltre, il compilatore non dovrebbe avvertirmi se provassi ad estendere i protocolli '@ obj'? – Yaman
@Yaman - Sappiamo tutti che gli avvisi del compilatore non sono perfetti in Swift e talvolta non sono chiari. Se guardi oltre 'non è conforme ', almeno sul mio sistema, ricevo anche un avviso' @ objc' che continua ad aggiungere '@ objc', ma non risolve mai il problema. Il problema non è l'estensione di un protocollo ObjC, mi dispiace per ogni confusione. Il problema è la creazione di un comportamento predefinito che dipende dall'accessibilità ObjC. Estendere e aggiungere nuovi metodi a un protocollo ObjC accessibile solo in Swift va bene. L'aggiunta di implementazioni predefinite che devono essere accessibili da ObjC è ciò che causa il problema. – Logan
Grazie per la precisione. Ho anche testato l'implementazione predefinita per il protocollo che implementa 'NSObjectProtocol' e funziona anche. Dichiarare 'NSObjectProtocol' equivale al segno' @ objc'? Forse il protocollo 'UITextFieldDelegate' è implicitamente marcato come' @ objc' ma il mio protocollo personalizzato che implementa 'NSObjectProtocol' non lo fa? – Yaman