Использование расширений протокола Swift 2

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

Я пытаюсь применить теорию к практическим случаям использования, поэтому давайте начнем с самого очевидного:

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

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


person rmvz3    schedule 10.12.2015    source источник


Ответы (1)


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

Есть два способа реализовать это: наследование (подклассы) или композиция (помощники). Подклассы вы, вероятно, понимаете. Чтобы сделать помощника, вы просто пишете нужную функцию и используете ее повторно:

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)
}

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

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

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

person Rob Napier    schedule 10.12.2015
comment
Спасибо, Роб. Это то, о чем я думал. : / - person rmvz3; 11.12.2015