在 Swift 中,我历来使用扩展来扩展封闭类型并提供方便的、无逻辑的功能,例如动画、数学扩展等。但是,由于扩展是遍布代码库的硬依赖,我总是在实施之前三思而后行作为扩展的东西。
不过,最近我看到 Apple 建议在更大范围内使用扩展,例如将协议实现为单独的扩展。
也就是说,如果你有一个实现协议 B 的类 A,你最终会得到这样的设计:
class A {
// Initializers, stored properties etc.
}
extension A: B {
// Protocol implementation
}
当你进入那个兔子洞时,我开始看到更多基于扩展的代码,比如:
fileprivate extension A {
// Private, calculated properties
}
fileprivate extension A {
// Private functions
}
我的一部分喜欢在单独的扩展中实现协议时获得的构建块。它使班级的各个部分真正不同。然而,一旦你继承了这个类,你将不得不改变这个设计,因为扩展函数不能被覆盖。
我认为第二种方法是......有趣。它的好处是您不必注释每个私有属性并将其用作私有,因为您可以为扩展指定它。
然而,这种设计也将存储和非存储属性、公共和私有函数分开,使得类的“逻辑”更难遵循(我知道写更小的类)。这与子类化问题一起,让我在扩展仙境的门廊上停了下来。
很想听听世界上的 Swift 社区如何看待扩展。你怎么看?有银弹吗?