0

我正在尝试使用 Swift 2 赶上这种面向协议的编程酷炫,但我目前很迷茫。

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

假设我有一个UITextField并且我想要有许多协议(例如电话、数字、长度限制……),这些协议符合UITextFieldDelegate并覆盖该textField:shouldChangeCharactersInRange:replacementString方法以完成所需的行为。

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

4

1 回答 1

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

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

一般来说,组合是更灵活的方法。只需编写一些函数并调用它们。

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

于 2015-12-10T21:36:06.640 回答