[英]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.