繁体   English   中英

Swift 2协议扩展用法

[英]Swift 2 Protocol extensions usage

我正在尝试使用Swift 2来应对这种面向协议的编程的凉爽性,但是我现在很迷茫。

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

假设我有一个UITextField并且我想拥有许多符合UITextFieldDelegate并覆盖textField:shouldChangeCharactersInRange:replacementString方法的协议(例如电话,数字,lengthLimited…),以实现所需的行为。

甚至可以使用带有该扩展名的“ Extensions.swift”文件,并将所需的协议分配给UITextField (例如,numeric,lengthLimited)吗? 那将非常有用。 如果是这样,是否有一种方法可以向UITextField插座分配协议,或者我需要UITextField并使它符合所需的协议? 如果是这种情况,那么与良好的旧子类相比,使用协议扩展不会带来太多优势。

您所描述的情况作为协议或扩展并没有多大意义。 您绝对不能将扩展应用于类的特定实例。

实现此目的的两种方法是继承(子类化)或组合(助手)。 子类化您可能会理解。 要成为一个助手,您只需编写所需的函数并重用它:

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

然后,您只需从实际委托人的textField(_:shouldChangeCharactersInRange:replacementString:)调用该共享代码textField(_:shouldChangeCharactersInRange:replacementString:)

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

如果您实际上并不需要所有这些参数,则可以选择简化函数的签名。

通常,组合是更灵活的方法。 只需编写一些函数并调用它们即可。

扩展和协议是功能强大且重要的工具。 它们只是与此问题无关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM