Swift 斯威夫特:全球职能部门是坏习惯吗?
我读过全局变量是坏的。但是,全局函数呢?假设我向我的iPhone应用程序项目中添加一个名为Swift 斯威夫特:全球职能部门是坏习惯吗?,swift,global,swift-extensions,Swift,Global,Swift Extensions,我读过全局变量是坏的。但是,全局函数呢?假设我向我的iPhone应用程序项目中添加一个名为Globals.swift的文件,其中包含func foo(){print(“foo”)}。这不是很糟糕,因为它可能与其他同名签名的全局函数冲突吗?根据相同的论点,使用扩展向现有类型添加新方法不是很糟糕吗?全局函数在词法范围内是全局的,但在可见性上不是。所以你真的不需要担心冲突。全局词法作用域意味着它们不是类型(类、结构、协议或枚举)的成员,也不是特定于局部作用域代码(如另一个函数的主体)的 但这与全球可见
Globals.swift
的文件,其中包含func foo(){print(“foo”)}
。这不是很糟糕,因为它可能与其他同名签名的全局函数冲突吗?根据相同的论点,使用扩展向现有类型添加新方法不是很糟糕吗?全局函数在词法范围内是全局的,但在可见性上不是。所以你真的不需要担心冲突。全局词法作用域意味着它们不是类型(类、结构、协议或枚举)的成员,也不是特定于局部作用域代码(如另一个函数的主体)的
但这与全球可见性不同,在多个方面
如果在名为MyTarget
的模块(应用程序或框架)中定义顶级(也称为全局)func foo()
,则该函数的完全命名空间签名为MyTarget.foo()
。即使Swift标准库声明了一个全局func foo()
,您的库也不一定冲突。(但是,任何调用站点都会变得模棱两可,因此您必须使用模块名称来区分MyTarget.foo()
和Swift.foo()
)
如果您的代码位于其他代码使用的模块中(例如,iOS应用程序和扩展目标之间共享的框架),则您的func foo()
声明是该模块的internal
。因此,导入模块的其他代码可以声明自己的func foo()
,并使用foo()
调用它,而不管您的函数是否存在。如果声明为public func foo()
,则它仅对导入您的模块有效。(即使如此,调用方也可以使用模块名称消除歧义,如上所述。)此外,您可以选择将函数声明为定义它的Swift文件的private
,在这种情况下,它在词法范围内是全局的,但仅限于该文件中的其他代码使用
类型扩展遵循相同的推理-默认情况下,您的扩展是创建它们的模块的内部
,并且在其名称空间中,因此冲突的风险很小
至于使用自由函数而不是带有方法的类型是否是好的程序设计,这是一个激烈争论的观点…如果没有指定模块,Swift似乎会调用内部函数。为了测试这一点,在我的iPhone应用程序项目中,我定义了全局函数
func print(text:String){Swift.print(text+“*”)}
,并在应用程序启动时调用了print(“test”)
。我不确定如果我加入一个定义全局print
函数的三十方框架,会发生什么。