ios – 如何在Swift中正确使用类扩展?

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协议类型.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...