swift中的命名空間及動態加載類

  • ###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,打印結果是: swift

    QQ20170113-0@2x.png
    這裏Webo就是命名空間,默認是項目的名字。

  • ###2.若是查看命名空間 swift中命名空間默認爲項目的名稱,具體查看的辦法爲在info.plist文件中,鍵名爲"CFBundleExecutable"的字符串: app

    查看命名空間.png

  • ###3如何更改命名空間 框架

    更改命名空間.png

  • ###4命名空間對動態加載類的影響(本人如今只接觸過這一個😜) 在oc中咱們想要動態的建立一個類的作法是,直接經過字符串穿件類,以下:ui

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

可是在swift中因爲命名空間的存在,若是還用上面的方法經過字符串動態的建立類是不能夠的(獲得的會是空)。swift經過字符串動態的建立類咱們須要在字符串的前面加上 」命名空間.「(沒有雙引號,可是有點),具體以下:spa

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()
        }
複製代碼
相關文章
相關標籤/搜索