iOS模块(Module)开发--命名空间
2018-03-08 本文已影响320人
George2016
swift的改进最大的地方之一,就是拥有了Objective-C一直令人诟病的地方没用命名空间,就是所有代码和静态库最终都会编译到同一个域和二进制中。因为这种机制,导致在加入静态库时导致冲突和失败,为了避免这种情况Objective-C
的做法是一般加上前缀,比如Apple的UI和NS前缀,各个系统框架加上SK,CG等。 虽然这种解决办法能大大降低冲突,但是加上前缀并不能完全避免冲突。另一种情况就是你想使用两个不同的库,他们分别引用了同一个很流行的库,大家公用的第三方库就会产生冲突。
终于说到swift,swift中由于可以使用命名空间
,即使名字相同的类型,只要是来自不同的命名空间,都可以和平共处。 跟C#的显式指定命名空间不同,swift的命名空间基于module
而不是显式指明,每个module代表了swift中的一个命名空间,也就是说,同一个target里的类型名称还是不能相同
。 在开发中,默认都是添加到主target,所以都处于同一个命名空间,并不能使用相同的名字。 我们需要通过创建cocoa(Touch)Framework方法新建一个module
,这样就可以在两个不同的target添加相同的名称类型。
以下两个类分别在两个不同的文件
//WomenModule模块中
//Women.swift
public class Women: NSObject {
public static func hello() {
print("hello from framework")
}
}
//这个文件存在于app的主target中
//Women.swift
class Women: NSObject {
class func hello() {
print("hello from app")
}
}
使用时,出现冲突,只需在类名前加上moduole的名称(也就是target名称):
Women.hello() //输出:hello from app
WomenModule.Women.hello() //输出:hello from framework
需要注意的是,在swift中要使用模块中的类,需要
import<#模块名#>
本案例中需要在ViewController中引入WomenModule
模块import UIKit import WomenModule
在同一个target中,也有另一个解决方法:
将名字重复的类型定义到不同的struct
中,以此避免冲突。
struct WomenContainer1 {
//这个文件存在于app的主target中
//Women.swift
class Women: NSObject {
class func hello() {
print("hello from WomenContainer1")
}
}
}
struct WomenContainer2 {
//这个文件存在于app的主target中
//Women.swift
public class Women: NSObject {
public static func hello() {
print("hello from WomenContainer2")
}
}
}
使用
WomenContainer1.Women.hello() //输出:hello from WomenContainer1
WomenContainer2.Women.hello() //输出:hello from WomenContainer2