[英]Swift 2 Protocol extensions usage
我正在嘗試使用Swift 2來應對這種面向協議的編程的涼爽性,但是我現在很迷茫。
我正在嘗試將該理論應用於實際用例,因此讓我們從最明顯的例子開始:
假設我有一個UITextField
並且我想擁有許多符合UITextFieldDelegate
並覆蓋textField:shouldChangeCharactersInRange:replacementString
方法的協議(例如電話,數字,lengthLimited…),以實現所需的行為。
甚至可以使用帶有該擴展名的“ Extensions.swift”文件,並將所需的協議分配給UITextField
(例如,numeric,lengthLimited)嗎? 那將非常有用。 如果是這樣,是否有一種方法可以向UITextField
插座分配協議,或者我需要UITextField
並使它符合所需的協議? 如果是這種情況,那么與良好的舊子類相比,使用協議擴展不會帶來太多優勢。
您所描述的情況作為協議或擴展並沒有多大意義。 您絕對不能將擴展應用於類的特定實例。
實現此目的的兩種方法是繼承(子類化)或組合(助手)。 子類化您可能會理解。 要成為一個助手,您只需編寫所需的函數並重用它:
func numericTextField(_ textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
// The code you'd want for numerics
}
然后,您只需從實際委托人的textField(_:shouldChangeCharactersInRange:replacementString:)
調用該共享代碼textField(_:shouldChangeCharactersInRange:replacementString:)
。
func textField(_ textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
return numericTextField(textField, shouldChangeCharactersInRange: range, replacementString: String)
}
如果您實際上並不需要所有這些參數,則可以選擇簡化函數的簽名。
通常,組合是更靈活的方法。 只需編寫一些函數並調用它們即可。
擴展和協議是功能強大且重要的工具。 它們只是與此問題無關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.