Swift 2协议扩展使用

时间:2015-12-10 21:26:31

标签: ios swift protocols protocol-extension

我正在尝试使用Swift 2赶上这种面向协议的编程酷,但我现在已经迷失了。

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

假设我有一个UITextField,我希望有许多符合UITextFieldDelegate的协议(例如phone,numeric,lengthLimited ......)并覆盖textField:shouldChangeCharactersInRange:replacementString方法来完成所需的行为。

甚至可以使用带有此扩展名的“Extensions.swift”文件,并将所需的协议分配给UITextField(例如,numeric,lengthLimited)?那将非常有用。如果是这样,有没有办法将协议分配给UITextField出口,或者我需要继承UITextField并使其符合所需的协议?如果是这种情况,那么在使用协议扩展而不是旧的子类化方面我没有太多的优势。

1 个答案:

答案 0 :(得分: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)
}

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

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

扩展程序和协议是强大而重要的工具。他们与此问题无关。