我试图赶上这个面向协议的编程酷使用Swift 2,但我现在完全迷路了。
我试图将这一理论应用于实际用例,所以让我们从最显而易见的开始:
假设我有一个UITextField,我想有许多协议(例如电话、数字、有限长度…)。它符合UITextFieldDelegate并覆盖textField:shouldChangeCharactersInRange:replacementString方法以完成所需的行为。
是否可能有一个具有此扩展名的"Extensions.swift“文件并将所需的协议分配给UITextField (例如数字文件,lengthLimited)?那会很有用的。如果是这样的话,是否有一种将协议分配给(比方说) UITextField出口的方法,或者我需要对UITextField进行子类,并使其符合所需的协议?如果是这样的话,那么我看不出使用协议扩展比好的旧子类有多大的优势。
发布于 2015-12-10 21:36:06
您所描述的情况作为协议或扩展没有多大意义。您肯定不能将扩展应用于类的特定实例。
实现这一功能的两种方法是继承(子类)或组合(帮助)。子类化你可能会理解。要创建一个助手,只需编写您想要的函数并重用它:
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)
}当然,如果您不需要所有这些参数,您可以选择简化函数的签名。
一般来说,构图是比较灵活的方法。只需编写一些函数并调用它们。
扩展和协议是强大而重要的工具。他们只是和这个问题无关。
https://stackoverflow.com/questions/34212027
复制相似问题