Objective-C没有命名空间,为了避免冲突,Objective-C的类型一般都会加上两到三个字母的前缀,比如Apple保留的NS和UI前缀,各个系统框架的前缀,各个系统框架的前缀SK(StoreKit),CG(CoreGraphic)等。
Swift的命名空间是基于module而不是在代码中显示地指明,每个module代表了Swift中的一个命名空间。也就是说,同一个target里的类型名称还是不能相同的。
//MyFramework.swift
//这个文件存在于MyFramework.framework中
public class MyClass {
public class func hello() {
println("hello from framework")
}
}
//MyApp.swift
//这个文件存在于app的主target中
class MyClass {
class func hello() {
println("hello from app")
}
}
在使用时,在可能出现冲突的时候,我们需要在类型名称前面加上module的名字(也就是target的名字):
MyClass.hello()
//hello from app
MyFramework.MyClass.hello()
//hello from framework
另一种策略是使用类型嵌套的方法来指定访问的范围。常见的做法是将名字重复的类型定义到不同的struct中,以此避免冲突。这样在不使用多个module的情况下也能取得隔离同样名字的类型的效果:
struct MyClassContainer1 {
class MyClass {
class func hello() {
println("hello from MyClassContainer1")
}
}
}
struct MyClassContainer2 {
class MyClass {
class func hello() {
println("hello from MyClassContainer2")
}
}
}
MyClassContainer1.MyClass.hello()