Swift-命名空間匆篓,反射機制

6d66c5b41af24014b0617b5e16a9fdbb.png

傳送門
Objective-C 一個一直以來令人詬病的地方就是沒有命名空間,在應用開發(fā)時寇窑,所有的代碼和引用的靜態(tài)庫最終都會被編譯到同一個域和二進制中鸦概。這樣的后果是一旦我們有重復的類名的話,就會導致編譯時的沖突和失敗甩骏。為了避免這種事情的發(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 里的類型名稱還是不能相同的咬腋。在我們進行 app 開發(fā)時羹膳,默認添加到 app 的主 target 的內容都是處于同一個命名空間中的,我們可以通過創(chuàng)建 Cocoa (Touch) Framework 的 target 的方法來新建一個 module根竿,這樣我們就可以在兩個不同的 target 中添加同樣名字的類型了:

  • 在swift 中存在命名空間陵像,同一命名空間下全局共享.
  • 第三方框架使用:直接拖入項目中,從屬于一個命名空間寇壳,很可能沖突(所以盡量用cocoapod)
  • NSClassFromString(反射機制): 最重要的目的醒颖,就是解耦 。例子:(反射機制和工廠方法)
// MyFramework.swift
// 這個文件存在于 MyFramework.framework 中
public class MyClass {
    public class func hello() {
        print("hello from framework")
    }
}

// MyApp.swift
// 這個文件存在于 app 的主 target 中
class MyClass {
    class func hello() {
        print("hello from app")
    }
}

在使用時壳炎,如果出現(xiàn)可能沖突的時候泞歉,我們需要在類型名稱前面加上 module 的名字 (也就是 target 的名字):

MyClass.hello()
// hello from app

MyFramework.MyClass.hello()
// hello from framework

因為是在 app 的 target 中調用的,所以第一個 MyClass 會直接使用 app 中的版本冕广,第二個調用我們指定了 MyFramework 中的版本疏日。

另一種策略是使用類型嵌套的方法來指定訪問的范圍。常見做法是將名字重復的類型定義到不同的 struct 中撒汉,以此避免沖突。這樣在不使用多個 module 的情況下也能取得隔離同樣名字的類型的效果:

struct MyClassContainer1 {
    class MyClass {
        class func hello() {
            print("hello from MyClassContainer1")
        }
    }
}

struct MyClassContainer2 {
    class MyClass {
        class func hello() {
            print("hello from MyClassContainer2")
        }
    }
}

使用時:

MyClassContainer1.MyClass.hello()
MyClassContainer2.MyClass.hello()

其實不管哪種方式都和傳統(tǒng)意義上的命名空間有所不同涕滋,把它叫做命名空間睬辐,更多的是一種概念上的宣傳。不過在實際使用中只要遵守這套規(guī)則的話,還是能避免很多不必要的麻煩的溯饵,至少唾手可得的是我們不再需要給類名加上各種奇怪的前綴了侵俗。

實戰(zhàn):通過字符串獲取 類

在 AppDelegate 中設置window 的根控制器

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        
        window = UIWindow()
        window?.backgroundColor = UIColor.white
        // 設置根控制器,需要添加命名空間 -》 通常是 "項目名.ClassName"
        // 注意: 項目名 不能有 數(shù)字 特殊符號
        // (1) 獲取命名空間
        let nameSpace = Bundle.main.infoDictionary?["CFBundleName"] as! String
        //(2) 拼接
        let clsName = nameSpace + "." + "ViewController"
        //AnyClass? ->視圖控制器的類型
        let cls = NSClassFromString(clsName) as? UIViewController.Type
        // 使用類名創(chuàng)建 控制器
        let vc = cls?.init()
        window?.rootViewController = vc
        window?.makeKeyAndVisible()
        return true
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市丰刊,隨后出現(xiàn)的幾起案子隘谣,更是在濱河造成了極大的恐慌,老刑警劉巖啄巧,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寻歧,死亡現(xiàn)場離奇詭異,居然都是意外死亡秩仆,警方通過查閱死者的電腦和手機码泛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來澄耍,“玉大人噪珊,你說我怎么就攤上這事∑肓” “怎么了痢站?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長选酗。 經常有香客問我阵难,道長,這世上最難降的妖魔是什么星掰? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任多望,我火速辦了婚禮,結果婚禮上氢烘,老公的妹妹穿的比我還像新娘怀偷。我一直安慰自己,他們只是感情好播玖,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布椎工。 她就那樣靜靜地躺著,像睡著了一般蜀踏。 火紅的嫁衣襯著肌膚如雪维蒙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天果覆,我揣著相機與錄音颅痊,去河邊找鬼。 笑死局待,一個胖子當著我的面吹牛斑响,可吹牛的內容都是我干的菱属。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼舰罚,長吁一口氣:“原來是場噩夢啊……” “哼纽门!你這毒婦竟也來了?” 一聲冷哼從身側響起营罢,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤赏陵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后饲漾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝙搔,經...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年能颁,在試婚紗的時候發(fā)現(xiàn)自己被綠了杂瘸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡伙菊,死狀恐怖败玉,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情镜硕,我是刑警寧澤运翼,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站兴枯,受9級特大地震影響血淌,放射性物質發(fā)生泄漏。R本人自食惡果不足惜财剖,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一悠夯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧躺坟,春花似錦沦补、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至美侦,卻和暖如春产舞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背菠剩。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工易猫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人具壮。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓擦囊,卻偏偏與公主長得像违霞,于是被迫代替她去往敵國和親嘴办。 傳聞我的和親對象是個殘疾皇子瞬场,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內容

  • Objective-C 一個一直以來令人詬病的地方就是沒有命名空間,在應用開發(fā)時涧郊,所有的代碼和引用的靜態(tài)庫最終都會...
    二先生Developer閱讀 1,153評論 0 1
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,274評論 25 707
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫贯被、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,118評論 4 61
  • 臨近期末妆艘,每天都很忙彤灶,我每天都想早睡早起,可堅持不了一天批旺,便會回到原樣幌陕,因此可見,一個人的習慣汽煮,想要輕易改變搏熄,真不...
    06暖陽閱讀 375評論 2 2
  • 起初,神創(chuàng)造天地暇赤。地是空虛混沌心例,淵面黑暗;神的靈運行在水面上鞋囊。 神說:“要有光”止后,就有了光。神看光是好的溜腐,就把光暗...
    OnlywantyouJesu閱讀 498評論 0 0