ma1*_*w28 3 global swift swift-extensions
我读过全局变量很糟糕.但是,全球职能呢?假设我在我的iPhone应用程序项目中添加了一个名为Globals.swiftcontains 的文件func foo() { print("foo") }.这不是很糟糕,因为它可能与同名和签名的其他全局函数冲突吗?通过相同的论点,使用扩展来向现有类型添加新方法并不是一件坏事吗?
全局函数在词法范围内是全球性的,但在可见性方面则不然.所以你真的不需要担心冲突.全局词法范围意味着它们不是类型(类,结构,协议或枚举)的成员,也不是特定于本地范围的代码,例如另一个函数的主体.
但这在很多方面与全球可见性不同.
如果func foo()在名为的模块(app或框架)中定义顶级(也称为全局)MyTarget,则该函数的完全命名空间签名为MyTarget.foo().即使Swift标准库要声明全局func foo(),你的也不一定会发生冲突.(但是,任何调用站点都会变得模糊不清,因此您必须使用模块名称来区分MyTarget.foo()和Swift.foo().)
如果您的代码位于其他代码使用的模块中(例如,iOS应用程序和扩展目标之间共享的框架),那么您的func foo()声明就是internal该模块.因此,导入模块的其他代码可以声明它自己的func foo(),并且只是调用它foo(),无论您的函数是否存在.它只对导入你的模块有影响,如果它被声明为public func foo().(即便如此,调用者也可以使用模块名称消除歧义,如上所述.)此外,您可以选择将函数声明为private定义它的Swift文件,在这种情况下,它在词法范围内是全局的,但仅限于仅使用该文件中的其他代码.
类型扩展遵循相同的推理 - 您的扩展默认internal为创建它们的模块,并且在其命名空间中,因此冲突的风险很小.
至于使用自由函数而不是使用方法的类型是否是好的程序设计,这是一个备受争议的问题......
| 归档时间: |
|
| 查看次数: |
1847 次 |
| 最近记录: |