swift中的名稱空間及動態載入類

sayHellooX發表於2018-01-03
  • ###1.何為名稱空間 OC中沒有名稱空間的概念,在進行應用開發時,所有的程式碼和引用的靜態庫最終會被編譯到同一個域和二進位制檔案中。這樣當兩個類名重複的時候,就會導致編譯衝突和失敗。這也就是為什麼我們在寫OC程式碼的時候要新增類名字首的原因。比如蘋果本身保留的字首UI和NS 還有各個系統框架的字首AF、SD等,這樣做可以大大降低引起衝突的機率,但是風險仍然存在,如果你在專案中同時載入進兩個不同的庫,而這兩個庫都分別引用了同一個第三方庫而沒有修改名字,這樣就會發生衝突。 Swift由於名稱空間的存在,既是兩個名稱相同的類,只要他們來自不同的名稱空間就不會產生編譯時的衝突。 "在 Swift 中,由於可以使用名稱空間了,即使是名字相同的型別,只要是來自不同的名稱空間的話,都是可以和平共處的。和 C# 這樣的顯式在檔案中指定名稱空間的做法不同,Swift 的名稱空間是基於 module 而不是在程式碼中顯式地指明,每個 module 代表了 Swift 中的一個名稱空間。也就是說,同一個 target 裡的型別名稱還是不能相同的。在我們進行 app 開發時,預設新增到 app 的主 target 的內容都是處於同一個名稱空間中的,我們可以通過建立 Cocoa (Touch) Framework 的 target 的方法來新建一個 module,這樣我們就可以在兩個不同的 target 中新增同樣名字的型別了。 在swift中類名的組成格式是 namespace.類名。比如我們在任意一個控制器的viewDidLoad()方法中列印self,列印結果是:

    QQ20170113-0@2x.png
    這裡Webo就是名稱空間,預設是專案的名字。

  • ###2.如果檢視名稱空間 swift中名稱空間預設為專案的名稱,具體檢視的辦法為在info.plist檔案中,鍵名為"CFBundleExecutable"的字串:

    檢視名稱空間.png

  • ###3如何更改名稱空間

    更改名稱空間.png

  • ###4名稱空間對動態載入類的影響(本人現在只接觸過這一個?) 在oc中我們想要動態的建立一個類的做法是,直接通過字串穿件類,如下:

NSString *classNameStr = @"className";
id object = [[NSClassFromString(classNameStr) alloc]init];
複製程式碼

但是在swift中由於名稱空間的存在,如果還用上面的方法通過字串動態的建立類是不可以的(得到的會是空)。swift通過字串動態的建立類我們需要在字串的前面加上 ”名稱空間.“(沒有雙引號,但是有點),具體如下:

let classNameStr = "classNameStr"
//動態獲得名稱空間
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就是通過字串動態載入後的類,我們可以通過他建立新的例項
            let newObject = nameVc.init()
        }
複製程式碼

相關文章