【问题标题】:Extending class with protocol VS implementing the protocol inside the class使用协议扩展类 VS 在类内部实现协议
【发布时间】:2017-05-19 11:52:44
【问题描述】:

我正在学习 Swift 3,以及它在 Objective-C 方面的独特范式结构,我偶然发现了一种设计模式,我不知道该怎么做。让我直接提出问题。

以前在 Objective-C 中,我们可以在类本身中实现协议/委托。我看到有一个与此非常相似的 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 中所做的。但现在我得到了另一种在类中实现协议/委托的方法。

  class MyClass : UIViewController , UITextFieldDelegate {

   func doSomething(){
       theTextField.delegate = self
   }

 }

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

现在我有点困惑。这也是实现委托模式的另一种方式,还是还有更多?这只是一种设计范式还是还有其他目的?

【问题讨论】:

  • 这是一篇不错的相关文章:natashatherobot.com/using-swift-extensions
  • 根据 Swift 惯例,以大写字母开头的类命名。顺便说一句,您正在扩展 EQHomeViewController 而不是 MyClass
  • @LeoDabus 我的错,请忽略错别字。我已经编辑了它们

标签: ios swift swift3 delegates protocols


【解决方案1】:

客观答案是:

两者没有区别。

主观答案是:

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

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

这在 Objective-C 中不是什么大问题,因为您可以简单地使用#PRAGMA Mark - 并且您可以让您的代码井井有条。由于 Swift 中没有这样的东西,有些人使用扩展来拆分他们的代码。 (如在 cmets 中与您链接的 Natasha 的文章中所见)。

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


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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2015-05-25
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多