在Swift中避免类型名称冲突

3

我正在用Swift编写一个静态库,将在多个项目中重复使用。问题是,我正在使用的类和结构体名称很常见,很容易与其他库/框架发生冲突。我没有看到任何明显的方法可以在Swift中创建自己的命名空间。那么,在多个库/框架中避免类之间的名称冲突最好的方法是什么?


3
除了“给不同的名称”之外,实际上你没有其他可以做的事情。话虽如此,名称冲突并不是那么糟糕,因为你可以在模块名前加上前缀来解决它们,比如Foundation.TimerYourModule.Timer - Sweeper
在iOS中,传统的做法是使用两个字母的前缀,例如UITextFiledCBPeripheral - Paulw11
2
@Paulw11 我猜你是想说Objective-C的方法 :) 在Swift中,你可以使用模块名称来解决命名冲突,而这在Obj-C中是不可能的。因此,在Obj-C中给所有类型加前缀的原因就出现了。 - Dávid Pásztor
2个回答

9

你不需要避免使用自己喜欢的名称。当你想要访问你的类、结构体或协议时,只需使用你的模块名称作为命名空间即可。

例如:

import MyModule

let a: MyModule.Result // the Result type defined inside the `MyModule`
let b: Result // Swift's Result type

2
如其他人所说,如果存在冲突,您可以始终使用模块名称完全限定符号名称(请参见Cong的答案)。
在Objective-C时代,苹果公司建议使用您的缩写或公司缩写作为符号名称的前缀来处理这个问题。但我不太喜欢它,因为它会创建丑陋的名称,使基本含义难以理解。
使用模块名称/框架名称的缩写可能会好一些,这也是苹果公司的做法,例如UIKit视图是UIView,AFNetworking的连接对象可能是AFNConnection。
其他人在评论中强烈主张这已经不再需要和不再推荐了。(就像我说的,我从来不喜欢它。)

2
苹果建议处理这个问题的方式是使用你的首字母缩写或公司的首字母缩写作为符号名称的前缀。请问你能提供一下参考资料吗?据我所知,这是Objective-C的做法,苹果在Swift中并没有提出类似的建议。 - Dávid Pásztor
我不记得在哪里看到这个,而且它很可能追溯到Objective-C的时代。然而,我以苹果的框架作为证据,这些框架始终遵循这种模式。UIKit、Core Location、Core Image、Core ML。 - Duncan C
1
这并不是真正的证据 - 考虑到所有都是用Objective-C编写的,而不是Swift。如果你检查新的苹果框架,比如Combine或SwiftUI,它们都是纯Swift的,没有任何类型有前缀。 - Dávid Pásztor
1
前缀名称是为了弥补C和ObjC缺乏命名空间的不足,不适用于Swift代码。在Swift中,所有“顶级”符号都通过其定义模块隐式命名空间化。即使是标准库也是使用Swift.进行命名空间化的,这对于在数组扩展中调用全局max函数(其中max指的是Array.max(by:))时非常有用,可以使用Swift.max(a, b) - Alexander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接