首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift 2协议扩展使用

Swift 2协议扩展使用
EN

Stack Overflow用户
提问于 2015-12-10 21:26:31
回答 1查看 116关注 0票数 0

我试图赶上这个面向协议的编程酷使用Swift 2,但我现在完全迷路了。

我试图将这一理论应用于实际用例,所以让我们从最显而易见的开始:

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

是否可能有一个具有此扩展名的"Extensions.swift“文件并将所需的协议分配给UITextField (例如数字文件,lengthLimited)?那会很有用的。如果是这样的话,是否有一种将协议分配给(比方说) UITextField出口的方法,或者我需要对UITextField进行子类,并使其符合所需的协议?如果是这样的话,那么我看不出使用协议扩展比好的旧子类有多大的优势。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-10 21:36:06

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

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

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

然后您只需调用实际委托的textField(_:shouldChangeCharactersInRange:replacementString:)中的共享代码即可。

代码语言:javascript
复制
func textField(_ textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    return numericTextField(textField, shouldChangeCharactersInRange: range, replacementString: String)
}

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

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34212027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档