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
,因此该模块中的所有文件都可以访问。
您可以根据需要将其更改为 public
或 private
。
如果相同的两个扩展彼此可见并添加具有相同签名的函数,就会发生您引用的冲突。
因此,如果您想在多个文件中创建 trimmed()
扩展并在每个文件中为其提供不同的实现,您需要将它们全部设为私有以避免任何冲突。
虽然……这可能不是一个好主意,因为它可能会与您项目中的其中几个混淆。
我正在学习 swift 编程语言,最近遇到了扩展的概念,您可以在其中扩展现有 class 或结构的功能。例如 (source):
extension String {
func trimmed() -> String {
self.trimmingCharacters(in: .whitespacesAndNewlines)
}
}
我的问题是,除了我写这个的文件之外,这个修改还影响了哪些其他代码?
例如,如果我在一个文件中声明 String
的扩展名,它会影响我导入的库中 String
的行为吗?或者如果我在一个文件中声明这个扩展,它会在同一个项目的其他文件中可见吗?
与此相关,我不明白Swift 是如何解决扩展之间的冲突的。举例来说,我导入了两个都扩展了 String
的库。哪个生效了?
我已经尝试使用谷歌搜索“swift 扩展范围”和“swift 冲突扩展”等术语,但没有找到任何可以完整描述其工作原理的内容。我还注意到 Swift 不允许我在单个文件中重新声明扩展名,但这并没有回答我关于导入的扩展名如何相互影响的问题。
扩展的范围遵循与创建结构、类 和 swift 中的其他类型和变量时相同的规则。
默认情况下,扩展名是创建它的模块的 internal
,因此该模块中的所有文件都可以访问。
您可以根据需要将其更改为 public
或 private
。
如果相同的两个扩展彼此可见并添加具有相同签名的函数,就会发生您引用的冲突。
因此,如果您想在多个文件中创建 trimmed()
扩展并在每个文件中为其提供不同的实现,您需要将它们全部设为私有以避免任何冲突。
虽然……这可能不是一个好主意,因为它可能会与您项目中的其中几个混淆。