2016-05-17 158 views
6

我有两个选择实现当斯威夫特协议一致性,具有相同的最终结果:在哪里实现Swift协议?

  • 实现类内的协议 - 即状态一致性的类定义的顶部,并把实施在课堂内部,或者
  • 在扩展中实现协议 - 即在整个课程之外完成代码协议一致性。

下面是一个例子:

public class MyClass : CustomDebugStringConvertible { 
    ... // Something 
    public var debugDescription : String { 
     return "MyClass" 
    } 
} 

与在夫特书籍

class MyClass { 
    ... // Something 
} 
extension MyClass : CustomDebugStringConvertible { 
    public var debugDescription: String { 
     return "MyClass" 
    } 
} 

代码样本往往集中在第一种方法; Apple's source code of Swift core显示它们仅使用第二种方法(例如,参见BoolOptional)。

视情况而定,两种方法之间是否有合适的方法来决定,还是仅仅是编码偏好问题?

+2

这完全是一个偏好问题,因此是一个意见问题。就我个人而言,我几乎总是做后者,但并非总是如此。另请参阅我对扩展的评论:http://www.apeth.com/swiftBook/ch04.html#_extending_object_types – matt

回答

4

这更多的是编码偏好和可读性的问题。如果你认为你的班级将会变得庞大,那么在扩展中实现它可能更有意义,这样它的方法不会给你的班级增加混乱。如果是短期课程,我会一个一个地说,因为可读性受到的影响较小。

4

我认为它主要作为编码偏好。在我的团队中,我们已经开始采用第二种方法。起初我认为这是一个奇怪的延伸使用,但我喜欢它。它将协议的实施方法很好地结合在一起,给人一种印象,即类本身更小(仅仅是光学)。如果类有一个tableview,并且使用扩展来实现数据源和委托,我可以看到一些复杂性或混淆的机会。如果某个人将该类别划分为子类别,则他们可能不知道该扩展名并看到意外的行为。