在哪里实现Swift协议?

时间:2016-05-17 16:24:45

标签: swift protocols

在Swift中实现协议一致性时我有两个选择,结果相同:

  • 在类中实现协议 - 也就是说,在类定义顶部声明一致性,并将实现放在类主体中,或
  • 在扩展程序中实施协议 - 即完全在类外编写协议一致性。

以下是一个例子:

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

VS

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

Swift书中的代码示例倾向于专注于第一种方法; Apple's source code of Swift core表明他们只使用第二种方法(例如,请参阅BoolOptional)。

根据具体情况,是否有合理的方法来决定两种方法,还是仅仅是编码偏好的问题?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

我认为它主要是编码偏好。在我的团队中,我们已经开始采用第二种方法。起初我认为这是一个奇怪的扩展使用,但我已经喜欢它了。它将协议的实现方法很好地保存在一起,给人的印象是类本身更小(实际上只是光学)。如果类有一个tableview并且你使用扩展来实现数据源和委托,我可以看到一些混乱或混淆的机会。如果有人然后对该类进行子类化,他们可能不会意识到扩展并看到意外行为。