簡體   English   中英

Swift 2協議擴展用法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM