swift 中的扩展范围是什么?

What is the scope of extensions in swift?

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

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

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

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

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

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

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

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

您可以根据需要将其更改为 publicprivate

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

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

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