斯威夫特:全球职能是不好的做法?

时间:2016-01-26 19:43:19

标签: swift global swift-extensions

我读过全局变量很糟糕。但是,全球职能呢?假设我在我的iPhone应用程序项目中添加了一个名为Globals.swift的文件,其中包含func foo() { print("foo") }。并不是那么糟糕,因为它可能会与同名的其他全球职能部门发生冲突。签名?通过相同的论证,使用扩展来向现有类型添加新方法并不是很糟糕吗?

1 个答案:

答案 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到创建它们的模块,并且在其命名空间中,因此几乎没有冲突的风险。

至于使用自由函数而不是使用方法的类型是否是好的程序设计,这是一个备受争议的观点问题......