2015-12-10 4 views
0

Я пытаюсь догнать эту прохладу программирования, ориентированную на программирование, используя Swift 2, но я в настоящее время довольно потерян.Использование расширений протокола Swift 2

Я пытаюсь применить теорию к практике прецедентов, так давайте начнем с самим очевидным:

Скажем, у меня есть UITextField, и я хочу иметь много протоколов (например, телефон, цифровой, lengthLimited ...) которые соответствуют UITextFieldDelegate и переопределяют метод textField:shouldChangeCharactersInRange:replacementString для достижения желаемого поведения.

Возможно ли иметь файл «Extensions.swift» с этими расширениями и назначить нужные протоколы UITextField (например, числовые, ограниченные по длине)? Это было бы очень полезно. Если да, существует ли способ назначить протокол, допустим, для вывода UITextField, или мне нужно будет подклассифицировать UITextField и заставить его соответствовать требуемым протоколам? Если это так, то я не вижу слишком много преимуществ в использовании расширений протоколов над старым старым подклассом.

ответ

5

Дело, которое вы описываете, не имеет большого смысла в качестве протокола или расширений. Вы определенно не можете применить расширение к конкретному экземпляру класса.

Двумя способами реализовать это будет наследование (подклассификация) или композиция (помощники). Подкласс, вероятно, вы поймете. Для того, чтобы сделать помощника, вы просто написать функцию, которую вы бы хотите и повторно использовать его:

func numericTextField(_ textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
    // The code you'd want for numerics 
} 

И тогда вы бы просто назвать это общий код из textField(_:shouldChangeCharactersInRange:replacementString:) вашего фактического делегата.

func textField(_ textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
    return numericTextField(textField, shouldChangeCharactersInRange: range, replacementString: String) 
} 

Возможно, вы захотите упростить подпись функции, если вам действительно не нужны все эти параметры, конечно.

В целом, композиция представляет собой более гибкий подход. Просто напишите некоторые функции и вызовите их.

Расширения и протоколы являются мощными и важными инструментами. Они просто не связаны с этой проблемой.

+0

Спасибо, Роб. Это то, о чем я думал. : / – rmvz3

Смежные вопросы