gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 05:17:21 24 4
gpt4 key购买 nike

在 Swift 中,我一直使用扩展来扩展封闭类型并提供方便的、无逻辑的功能,如动画、数学扩展等。但是,由于扩展是散布在你的代码库中的硬依赖,我总是认为三个在将某些东西实现为扩展之前的次数。

不过,最近我看到 Apple 建议在更大程度上使用扩展,例如将协议(protocol)实现为单独的扩展。

也就是说,如果你有一个实现协议(protocol) B 的类 A,你最终会得到这样的设计:

class A {
// Initializers, stored properties etc.
}

extension A: B {
// Protocol implementation
}

当您进入那个兔子洞时,我开始看到更多基于扩展的代码,例如:

fileprivate extension A {
// Private, calculated properties
}

fileprivate extension A {
// Private functions
}

我的一部分喜欢在单独的扩展中实现协议(protocol)时获得的构建 block 。它使类(class)的各个部分真正截然不同。但是,一旦继承此类,就必须更改此设计,因为无法覆盖扩展功能。

我认为第二种方法……很有趣。它的优点之一是您不必将每个私有(private)属性和函数注释为私有(private),因为您可以为扩展指定它。

但是,这种设计也将存储属性和非存储属性、公共(public)函数和私有(private)函数分开,使得类的“逻辑”更难遵循(我知道写更小的类)。这一点,再加上子类化问题,让我在扩展仙境的门廊上停下来。

很想听听全世界的 Swift 社区如何看待扩展。你怎么看?有银弹吗?

最佳答案

当然,这只是我的意见,所以请看我将要写的内容。

我目前在我的项目中使用 extension-approach 有几个原因:

  • 代码更干净:我的类从未超过 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 顶部栏中阅读它非常有用

extension description

  • 这让我想起 Swift 是一种面向协议(protocol)的编程语言,而不是 OOP 语言。协议(protocol)和协议(protocol)扩展无所不能。而且我更喜欢使用协议(protocol)为我的类/结构添加安全层。例如我通常这样写我的模型:

    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 类中编辑您的 uidname 值,但是您不能在外部,因为您将只处理 User 协议(protocol)类型。

关于ios - 如何在 Swift 中正确使用类扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40502086/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com