在
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社区如何看待扩展.你怎么看?有银弹吗?
解决方法
当然,这只是我的意见,所以我要写的很容易.
我目前正在我的项目中使用扩展方法,原因如下:
>代码非常简洁:我的类永远不会超过150行,并且通过扩展分离使我的代码更具可读性并且由职责分隔
这通常是一个类的样子:
final class A { // Here the public and private stored properties } extension A { // Here the public methods and public non-stored properties } fileprivate extension A { // here my private methods }
扩展可以不止一个,当然,这取决于你的课程做什么.这对于组织代码并从Xcode顶部栏中读取它非常有用
>它提醒我Swift是一种面向协议的编程语言,而不是OOP语言.协议和协议扩展没有任何功能.我更喜欢使用协议为我的classes / struct添加安全层.例如,我通常以这种方式编写模型:
protocol User { var uid: String { get } var name: String { get } } final class UserModel: User { var uid: String var name: String init(uid: String,name: String) { self.uid = uid self.name = name } }
通过这种方式,您仍然可以在UserModel类中编辑您的uid和名称值,但您不能在外部编辑,因为您只能处理User协议类型.