swift - swift 的扩展范围是什么?

标签 swift swift-extensions

我正在学习 Swift 编程语言,最近遇到了扩展的概念,您可以在其中扩展现有类或结构的功能。例如 ( source ):

extension String {
    func trimmed() -> String {
        self.trimmingCharacters(in: .whitespacesAndNewlines)
    }
}

我的问题是,除了我编写此代码的文件外,此修改还会影响哪些其他代码?

例如,如果我在一个文件中声明了 String 的扩展,它会影响我导入的库中 String 的行为吗?或者,如果我在一个文件中声明此扩展,它是否会在同一项目的其他文件中可见?

与此相关,我不明白 Swift 如何解决扩展之间的冲突。例如,我导入了两个库,它们都扩展了 String。哪个生效?

我尝试在谷歌上搜索“swift 扩展范围”和“swift 冲突扩展”等术语,但没有找到任何可以完整描述其工作原理的内容。我还注意到 Swift 不允许我在单个文件中重新声明扩展,但这并没有回答我关于导入的扩展如何相互影响的问题。

最佳答案

扩展的范围遵循与在 swift 中创建结构、类和其他类型和变量时相同的规则。

默认情况下,扩展名是创建它的模块的内部,因此该模块中的所有文件都可以访问。

如果您愿意,可以将其更改为publicprivate

如果相同的两个扩展彼此可见并添加具有相同签名的函数,则会发生您引用的冲突。

因此,如果您想在多个文件中创建您的 trimmed() 扩展并在每个文件中为其提供不同的实现,您需要将它们全部设为私有(private)以避免任何冲突。

尽管……这可能不是一个好主意,因为它可能会与您项目中的其中几个混淆。

关于swift - swift 的扩展范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70725897/

相关文章:

swift - 交换键和值的字典扩展 - Swift 4.1

ios - (SocketIO.Swift) .connect 回调被调用但未连接到服务器

ios - 子类 uitableview 单元格以快速更改分隔符高度

swift - 无法使用 Xcode 8 导出 MacOS 存档

animation - 无法停止重复 UIView.animateWithDuration (Swift)

swift - 无法识别 Swift 中的字典扩展

swift - 如何使用私有(private)集扩展协议(protocol)?

swift - 使用键和值约束扩展字典

ios - 无法将自定义 IBAction 连接到按钮

swift - 将时间转换函数更改为 Swift 扩展