-
1.何為命名空間
OC中沒(méi)有命名空間的概念,在進(jìn)行應(yīng)用開(kāi)發(fā)時(shí)肚菠,所有的代碼和引用的靜態(tài)庫(kù)最終會(huì)被編譯到同一個(gè)域和二進(jìn)制文件中。這樣當(dāng)兩個(gè)類名重復(fù)的時(shí)候署鸡,就會(huì)導(dǎo)致編譯沖突和失敗案糙。這也就是為什么我們?cè)趯?xiě)OC代碼的時(shí)候要添加類名前綴的原因。比如蘋果本身保留的前綴UI和NS 還有各個(gè)系統(tǒng)框架的前綴AF靴庆、SD等时捌,這樣做可以大大降低引起沖突的幾率,但是風(fēng)險(xiǎn)仍然存在炉抒,如果你在項(xiàng)目中同時(shí)加載進(jìn)兩個(gè)不同的庫(kù),而這兩個(gè)庫(kù)都分別引用了同一個(gè)第三方庫(kù)而沒(méi)有修改名字奢讨,這樣就會(huì)發(fā)生沖突。
Swift由于命名空間的存在焰薄,既是兩個(gè)名稱相同的類拿诸,只要他們來(lái)自不同的命名空間就不會(huì)產(chǎn)生編譯時(shí)的沖突。
"在 Swift 中塞茅,由于可以使用命名空間了亩码,即使是名字相同的類型,只要是來(lái)自不同的命名空間的話野瘦,都是可以和平共處的描沟。和 C# 這樣的顯式在文件中指定命名空間的做法不同,Swift 的命名空間是基于 module 而不是在代碼中顯式地指明鞭光,每個(gè) module 代表了 Swift 中的一個(gè)命名空間吏廉。也就是說(shuō),同一個(gè) target 里的類型名稱還是不能相同的惰许。在我們進(jìn)行 app 開(kāi)發(fā)時(shí)席覆,默認(rèn)添加到 app 的主 target 的內(nèi)容都是處于同一個(gè)命名空間中的,我們可以通過(guò)創(chuàng)建 Cocoa (Touch) Framework 的 target 的方法來(lái)新建一個(gè) module汹买,這樣我們就可以在兩個(gè)不同的 target 中添加同樣名字的類型了佩伤。
在swift中類名的組成格式是 namespace.類名。比如我們?cè)谌我庖粋€(gè)控制器的viewDidLoad()方法中打印self,打印結(jié)果是:
這里Webo就是命名空間卦睹,默認(rèn)是項(xiàng)目的名字畦戒。
-
2.如果查看命名空間
swift中命名空間默認(rèn)為項(xiàng)目的名稱,具體查看的辦法為在info.plist文件中结序,鍵名為"CFBundleExecutable"的字符串:
-
3如何更改命名空間
-
4命名空間對(duì)動(dòng)態(tài)加載類的影響(本人現(xiàn)在只接觸過(guò)這一個(gè)??)
在oc中我們想要?jiǎng)討B(tài)的創(chuàng)建一個(gè)類的做法是障斋,直接通過(guò)字符串穿件類,如下:
NSString *classNameStr = @"className";
id object = [[NSClassFromString(classNameStr) alloc]init];
但是在swift中由于命名空間的存在,如果還用上面的方法通過(guò)字符串動(dòng)態(tài)的創(chuàng)建類是不可以的(得到的會(huì)是空)垃环。swift通過(guò)字符串動(dòng)態(tài)的創(chuàng)建類我們需要在字符串的前面加上 ”命名空間.“(沒(méi)有雙引號(hào)邀层,但是有點(diǎn)),具體如下:
let classNameStr = "classNameStr"
//動(dòng)態(tài)獲得命名空間
let name = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String
//這里以控制器為例
let vc:AnyClass? = NSClassFromString(name + "." + classNameStr)
if let vc = vc {
let nameVc = vc as! UIViewController.Type
//nameVc就是通過(guò)字符串動(dòng)態(tài)加載后的類遂庄,我們可以通過(guò)他創(chuàng)建新的實(shí)例
let newObject = nameVc.init()
}