Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 斯威夫特:全球职能部门是坏习惯吗?_Swift_Global_Swift Extensions - Fatal编程技术网

Swift 斯威夫特:全球职能部门是坏习惯吗?

Swift 斯威夫特:全球职能部门是坏习惯吗?,swift,global,swift-extensions,Swift,Global,Swift Extensions,我读过全局变量是坏的。但是,全局函数呢?假设我向我的iPhone应用程序项目中添加一个名为Globals.swift的文件,其中包含func foo(){print(“foo”)}。这不是很糟糕,因为它可能与其他同名签名的全局函数冲突吗?根据相同的论点,使用扩展向现有类型添加新方法不是很糟糕吗?全局函数在词法范围内是全局的,但在可见性上不是。所以你真的不需要担心冲突。全局词法作用域意味着它们不是类型(类、结构、协议或枚举)的成员,也不是特定于局部作用域代码(如另一个函数的主体)的 但这与全球可见

我读过全局变量是坏的。但是,全局函数呢?假设我向我的iPhone应用程序项目中添加一个名为
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
函数的三十方框架,会发生什么。