Swift 2 协议扩展使用

Swift 2 Protocol extensions usage

我正在尝试使用 Swift 2 来了解这种面向协议的编程技巧,但我现在很迷茫。

我正在尝试将理论应用到实际用例中,所以让我们从最明显的开始:

假设我有一个 UITextField 并且我想要许多符合 UITextFieldDelegate 并覆盖 [=13= 的协议(例如 phone、数字、长度限制...) ] 方法来完成所需的行为。

是否有可能拥有一个带有此扩展名的 "Extensions.swift" 文件并将所需的协议分配给 UITextField(例如数字、lengthLimited)?那将非常有用。如果是这样,有没有办法将协议分配给 UITextField 插座,或者我需要子类化 UITextField 并使其符合所需的协议?如果是这种情况,那么我认为使用协议扩展比使用旧的子类化没有太大优势。

您描述的情况作为协议或扩展没有多大意义。您绝对不能将扩展应用于 class.

的特定实例

实现它的两种方法是继承(subclassing)或组合(helpers)。 Subclassing 你大概明白了。要制作一个助手,您只需编写您想要的函数并重用它:

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

当然,如果您真的不需要所有这些参数,您可以选择简化函数的签名。

一般来说,组合是更灵活的方法。写点函数调用就行了

扩展和协议是强大而重要的工具。他们只是与这个问题无关。