【发布时间】:2017-03-22 23:24:06
【问题描述】:
在 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 社区如何看待扩展。你怎么看?有银弹吗?
【问题讨论】:
-
他们这样做只是为了 1.Hide 函数而不将所有函数文件标记为私有,2.Neater 看起来,就像每个扩展都可以做一些特定的工作。我真的没有反对这一点,在我的实践中它比 obj-c 中的
#pragma mark更好,如果需要,他们还可以轻松地将其拆分为多个文件 -
我们不能也说
class A: B, C, D { // Initializers, stored properties etc. // Protocol implementation B... }
标签: ios swift swift-extensions system-design