Objective-C 一個一直以來令人詬病的地方就是沒有命名空間蹦掐,在應(yīng)用開發(fā)時弄贿,所有的代碼和引用的靜態(tài)庫最終都會被編譯到同一個域和二進(jìn)制中茫打。這樣的后果是一旦我們有重復(fù)的類名的話混萝,就會導(dǎo)致編譯時的沖突和失敗嘹吨。
為了避免這種事情的發(fā)生搬味,Objective-C 的類型一般都會加上兩到三個字母的前綴,比如 Apple 保留的 NS 和 UI 前綴蟀拷,各個系統(tǒng)框架的前綴 SK (StoreKit)碰纬,CG (CoreGraphic) 等。Objective-C 社區(qū)的大部分開發(fā)者也遵守了這個約定问芬,一般都會將自己名字縮寫作為前綴悦析,把類庫命名為 AFNetworking 或者 MBProgressHUD 這樣。這種做法可以解決部分問題此衅,至少我們在直接引用不同人的庫時沖突的概率大大降低了强戴,但是前綴并不意味著不會沖突,有時候我們確實還是會遇到即使使用前綴也仍然相同的情況挡鞍。另外一種情況是可能你想使用的兩個不同的庫骑歹,分別在它們里面引用了另一個相同的很流行的第三方庫,而又沒有更改名字墨微。在你分別使用這兩個庫中的一個時是沒有問題的道媚,但是一旦你將這兩個庫同時加到你的項目中的話,這個大家共用的第三方庫就會和自己發(fā)生沖突了翘县。
在 Swift 中最域,由于可以使用命名空間了,即使是名字相同的類型锈麸,只要是來自不同的命名空間的話镀脂,都是可以和平共處的。和 C# 這樣的顯式在文件中指定命名空間的做法不同忘伞,Swift 的命名空間是基于 module 而不是在代碼中顯式地指明薄翅,每個 module 代表了 Swift 中的一個命名空間钞馁。也就是說,同一個 target 里的類型名稱還是不能相同的匿刮。在我們進(jìn)行 app 開發(fā)時僧凰,默認(rèn)添加到 app 的主 target 的內(nèi)容都是處于同一個命名空間中的。
- 在swift 中存在命名空間熟丸,同一命名空間下全局共享.
- 第三方框架使用:直接拖入項目中训措,從屬于一個命名空間,很可能沖突(所以盡量用cocoapod)
- NSClassFromString(反射機(jī)制): 最重要的目的光羞,就是解耦 绩鸣。例子:(反射機(jī)制和工廠方法)
獲取命名空間設(shè)置根控制器
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
window = UIWindow()
window?.backgroundColor = UIColor.white
let CFName = Bundle.main.infoDictionary?["CFBundleName"] as? String ?? ""
//點后面是所需 類名
// let vc = Bundle.main.nameSpace() + "." + "ViewController"
let vc = CFName + "." + "ViewController"
let vcType = NSClassFromString(vc) as? UIViewController.Type
window?.rootViewController = vcType?.init()
window?.makeKeyAndVisible()
return true
}
bundle的分類