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