亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

Swift中的命名空間詳解

2020-03-09 17:31:11
字體:
來源:轉載
供稿:網友

前言

Objective-C 一個一直以來令人詬病的地方就是沒有命名空間,在應用開發時,所有的代碼和引用的靜態庫最終都會被編譯到同一個域和二進制中。這樣的后果是一旦我們有重復的類名的話,就會導致編譯時的沖突和失敗。為了避免這種事情的發生,Objective-C 的類型一般都會加上兩到三個字母的前綴,比如 Apple 保留的 NS 和 UI 前綴,各個系統框架的前綴 SK (StoreKit),CG (CoreGraphic) 等。Objective-C 社區的大部分開發者也遵守了這個約定,一般都會將自己名字縮寫作為前綴,把類庫命名為 AFNetworking 或者 MBProgressHUD 這樣。這種做法可以解決部分問題,至少我們在直接引用不同人的庫時沖突的概率大大降低了,但是前綴并不意味著不會沖突,有時候我們確實還是會遇到即使使用前綴也仍然相同的情況。另外一種情況是可能你想使用的兩個不同的庫,分別在它們里面引用了另一個相同的很流行的第三方庫,而又沒有更改名字。在你分別使用這兩個庫中的一個時是沒有問題的,但是一旦你將這兩個庫同時加到你的項目中的話,這個大家共用的第三方庫就會和自己發生沖突了。

在 Swift 中,由于可以使用命名空間了,即使是名字相同的類型,只要是來自不同的命名空間的話,都是可以和平共處的。和 C# 這樣的顯式在文件中指定命名空間的做法不同,Swift 的命名空間是基于 module 而不是在代碼中顯式地指明,每個 module 代表了 Swift 中的一個命名空間。也就是說,同一個 target 里的類型名稱還是不能相同的。

命名空間namespace在C++、C#里面是一個常見概念,Swift中也引入了這樣一個機制,下面來探索一下這個命名空間的來龍去脈。

一、為什么需要命名空間

簡而言之一句話:為了避免命名的沖突

在開發中,尤其是在多模塊開發中,很難保證模塊之間的類名不會重復,為了保證不同模塊下同名的類可以正常使用而不報錯,引入命名空間來保證即使創建的類名一樣,只要命名空間不一樣,這些類也是不一樣的,所以,這是一種安全機制,用命名空間來防止沖突??梢钥闯觯琒wift中的類名的完整形式其實是“命名空間+類名”。我們可以嘗試在類中打印當前類來查看一下完整名字:

override func viewDidLoad() {super.viewDidLoad()print(self)}//打印結果是:<AA.ViewController: 0x7fec6a00e5c0>

二、命名空間查看與修改

從上面的打印結果來看,命名空間是我們項目的名字,那么如果查看呢?我們需要用源代碼的形式打開Info.plist,可以看到里面有一個字段CFBundleExecutable,它對應的值就是命名空間。

Swift,命名空間

如果要修改命名空間,注意不要直接編輯Info.plist,可以進入Build Settings中搜索Product Name,然后進行修改。

Swift,命名空間

三、命名空間如何獲取
既然知道可以通過Info.plist獲取命名空間,那么如何在程序中獲取呢?很顯然需要解析Info.plist文件,拿到CFBundleExecutable對應的value值。

let namespace = Bundle.main.infoDictionary!["CFBundleExecutable"]// 返回的是一個可選型  print(namespace!)

四、命名空間在開發中的使用

開發中有一種常見的情形,就是自定義TabBarController,然后在里面添加一個個子控制器,這里面常常存在一個問題:通過一個控制器名(字符串)來創建一個控制器(類)。下面對比一下Objective-C與Swift兩種語言的實現方式。

由于Objective-C中沒有命名空間,所以寫起來很輕松。

//viewDidLoad中添加一個個控制器- (void)viewDidLoad { [super viewDidLoad]; [self addNavigationChildVC:@"ContactViewController" :@"聯系人" :@"tabbar_contacts" :@"tabbar_contactsHL"];}//自定的方法中根據傳進來的字符串創建控制器-(void)addNavigationChildVC: (NSString *) vcName :(NSString *)title :(NSString *)nomalImageName :(NSString *)selectedImageName { //創建控制器 Class class = NSClassFromString(vcName); UIViewController *vc = [[class alloc]init]; ...}

Swift中命名空間的存在,如果按照上述做法得不到想要的結果,這時候就需要想辦法進行處理

//viewDidLoad中添加一個個控制器override func viewDidLoad() { super.viewDidLoad() addChildViewController(vcName: "ContactsViewController", title: "聯系人", image: "tabbar_contacts", selectedImage: "tabbar_contactsHL")}//創建一個函數來將控制器的名字轉成具體的類func stringToVC(vcName:String) -> UIViewController? { //獲取命名空間 guard let namespace = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String else {  print("獲取失敗")  return nil }   //拼接完整的類 guard let vcClass = NSClassFromString(namespace + "." + vcName) else {  print("拼接失敗")  return nil }  //轉換成UIViewController guard let vcType = vcClass as? UIViewController.Type else {  print("轉換失敗")  return nil }  //根據類型創建對應的控制器 let vc = vcType.init() return vc}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美日韩区| 欧美午夜激情视频| 92版电视剧仙鹤神针在线观看| 日本久久亚洲电影| 国产午夜精品视频免费不卡69堂| 69av视频在线播放| 欧美精品一区二区三区国产精品| 亚洲成人精品久久久| 成人av资源在线播放| 91av视频在线播放| 国产91ⅴ在线精品免费观看| 日韩在线国产精品| 亚洲国产精品人久久电影| 亚洲精品电影网| 国产精品爽爽爽爽爽爽在线观看| 亚洲黄色av网站| 日韩欧美成人区| 一本色道久久综合狠狠躁篇的优点| 91中文精品字幕在线视频| 欧美裸体xxxxx| 伊人久久久久久久久久久| 亚洲视频在线观看| 午夜精品久久久久久久99热浪潮| 亚洲精品白浆高清久久久久久| 久久精品视频一| 国产午夜精品视频| 精品视频偷偷看在线观看| 国产精品久久久久久久久久久久久| 性欧美亚洲xxxx乳在线观看| 91国产美女视频| 欧美有码在线视频| 在线精品视频视频中文字幕| 国产精品黄色av| 日韩高清不卡av| 日韩精品999| 中文字幕综合一区| 中文字幕免费精品一区| 日韩欧美第一页| 成人激情在线观看| 亚洲国产97在线精品一区| 日韩av资源在线播放| 色偷偷888欧美精品久久久| 欧美精品18videos性欧| 成人国内精品久久久久一区| 亚洲欧洲日产国产网站| 亚洲国产三级网| 大胆人体色综合| 日韩在线观看网站| 成人精品视频99在线观看免费| 精品视频久久久| 国产精品偷伦免费视频观看的| 国产v综合v亚洲欧美久久| 亚洲国产日韩欧美在线99| 亚洲欧美日韩精品久久奇米色影视| 亚洲一区亚洲二区亚洲三区| 亚洲另类激情图| 国产中文字幕91| 亚洲精品v欧美精品v日韩精品| 久久人人爽亚洲精品天堂| 2019亚洲日韩新视频| 欧美制服第一页| 欧美一级片久久久久久久| 国产精品香蕉国产| 日韩中文av在线| 不卡中文字幕av| 成人国产精品一区二区| 69影院欧美专区视频| 成人日韩av在线| 国产精品久久久久久久久久免费| 欧美精品videosex性欧美| 亚洲xxxx做受欧美| 欧美激情三级免费| 成人a级免费视频| 2019中文字幕在线免费观看| 日本成人黄色片| 亚洲视频国产视频| 欧美大胆a视频| 国产精品久久婷婷六月丁香| 国产丝袜一区二区三区免费视频| 亚洲一区二区中文字幕| 日韩av免费在线看| 午夜精品理论片| 国产日韩精品一区二区| 2024亚洲男人天堂| 欧美放荡办公室videos4k| 国产欧美一区二区三区在线| 57pao成人永久免费视频| 久久香蕉频线观| 91情侣偷在线精品国产| 日韩在线观看网站| 国产精品美女网站| 久久中文字幕在线| 日韩国产精品亚洲а∨天堂免| 欧美另类极品videosbest最新版本| 亚洲理论在线a中文字幕| 在线视频亚洲欧美| 国产精品成人观看视频国产奇米| 精品精品国产国产自在线| 久久全球大尺度高清视频| 91av视频在线观看| 亚洲国产精品久久久久| 日韩在线一区二区三区免费视频| 欧美大荫蒂xxx| 欧美黑人xxx| 国产亚洲精品综合一区91| 久久综合网hezyo| 成人精品一区二区三区电影免费| 日本亚洲欧洲色α| 91精品国产电影| 粉嫩老牛aⅴ一区二区三区| 成人激情视频在线观看| 国产精品一区二区三区久久久| 久久亚洲综合国产精品99麻豆精品福利| 日韩在线视频一区| 欧美日韩亚洲网| 久久久精品中文字幕| 欧美一区二区大胆人体摄影专业网站| 亚洲欧美激情一区| 亚洲精品成a人在线观看| 日韩在线视频中文字幕| 欧美另类高清videos| 亚洲最大福利视频网| 国产精品免费福利| 97精品国产97久久久久久| 精品偷拍一区二区三区在线看| 日本欧美一级片| 亚洲网站在线观看| 国产精品久久久91| 91产国在线观看动作片喷水| 久久久免费高清电视剧观看| 成人美女av在线直播| 日本国产高清不卡| 日韩视频免费在线| 欧美最顶级的aⅴ艳星| 久久久久久久久久亚洲| 中文字幕精品久久| 国产精品吊钟奶在线| 亚洲成色999久久网站| 色婷婷av一区二区三区久久| 国产精品91视频| 精品视频久久久| 九九精品在线视频| 亚洲福利在线看| 亚洲www在线观看| 亚洲欧美日韩中文在线制服| x99av成人免费| 国产在线98福利播放视频| 一本色道久久88综合亚洲精品ⅰ| 久久国产精品首页| 亚洲成人av片| 亚洲高清av在线| 午夜精品一区二区三区在线| 色偷偷偷亚洲综合网另类| 亚洲人精品午夜在线观看| 欧美在线日韩在线| 欧美自拍大量在线观看| 亚洲福利在线播放| 88国产精品欧美一区二区三区| 伊人精品在线观看| 北条麻妃在线一区二区| 国产精品美女久久久久av超清| 亚洲一区二区中文| 久久久久久国产精品三级玉女聊斋| 成人黄色网免费|