gpt4 book ai didi

ios - 使用协议(protocol)扩展类 VS 在类内部实现协议(protocol)

转载 作者:行者123 更新时间:2023-11-30 12:26:54 24 4
gpt4 key购买 nike

我正在学习 Swift 3 及其相对于 Objective-C 的独特范式结构,我偶然发现了一种设计模式,但我不知道该怎么理解。让我直接提出问题。

以前在 Objective-C 中,我们可以在类本身中实现协议(protocol)/委托(delegate)。我看到有一个 Swift 等价物与此非常相似。

示例:

class myClass : UIViewController , UITextFieldDelegate {
// somewhere inside the class we implement the delegate of
// UITextfieldDelegate, something like this

func doSomething(){
theTextField.delegate = self
}

func textFieldDidEndEditing(_ textField: UITextField) {
// works just fine
}

}

这正是我们在 Objective-C 中所做的。但现在我得到了另一种在类中实现协议(protocol)/委托(delegate)的方法。

  class MyClass : UIViewController , UITextFieldDelegate {

func doSomething(){
theTextField.delegate = self
}

}

extension MyClass : UITextFieldDelegate{
func textFieldDidEndEditing(_ textField: UITextField) {
//Even this works fine
}
}

现在我有点困惑。这是否也是实现委托(delegate)模式的另一种方式,或者还有更多内容?这只是一种设计范例还是还有其他目的?

最佳答案

客观答案是:

两者没有区别。

主观答案是:

这取决于您的代码组织风格。有些人认为使用扩展来遵守协议(protocol)“更干净”,因为它隔离了实际属于一致性逻辑的代码。

例如,单个类可能必须实现委托(delegate)和数据源(对于 UITableViews),但也可能符合其他自定义类,并且通过使用扩展,您可以清楚地看到使用哪些代码来符合哪些协议(protocol)。

这在 Objective-C 中并不是什么大问题,因为您可以简单地使用#PRAGMA Mark - 并且可以干净地组织您的代码。由于 Swift 中没有这样的东西,所以有些人使用扩展来分割他们的代码。 (如评论中链接到您的娜塔莎文章中所示)。

但是,通过扩展实现协议(protocol)一致性通常被认为是良好的做法。 (因为与其余逻辑有明显的分离)

<小时/>

此外,使用协议(protocol)还有一个额外的好处,那就是您实际上可以为您通常无法访问的类(那些不是由您构建的类)添加一致性。

我推荐 swift 文档,因为它清楚地解释了这一点。

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html#//apple_ref/doc/uid/TP40014097-CH24-ID151

另一个非常有趣的特殊情况是扩展协议(protocol)本身,它用于为该协议(protocol)提供“默认”行为,这样您就不必在您想要使其符合的每个类中实现它。

关于ios - 使用协议(protocol)扩展类 VS 在类内部实现协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44069406/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com