当前位置:  开发笔记 > IOS > 正文

Swift 2协议扩展使用

如何解决《Swift2协议扩展使用》经验,为你挑选了1个好方法。

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

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

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

甚至可以使用带有此扩展名的"Extensions.swift"文件并将所需的协议分配给UITextField(例如,numeric,lengthLimited)?那将非常有用.如果是这样,有没有办法将协议分配给一个UITextField插座,或者我需要子类化UITextField并使其符合所需的协议?如果是这种情况,那么我没有看到使用协议扩展而不是旧的子类化的太多优势.



1> Rob Napier..:

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

实现它的两种方法是继承(子类化)或组合(帮助器).你可能理解的子类化.要创建一个帮助器,您只需编写您想要的函数并重用它:

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

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

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

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

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有