最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Swift中的命名空間詳解

 更新時(shí)間:2018年12月16日 14:43:43   作者:YungFan  
這篇文章主要給大家介紹了關(guān)于Swift中命名空間的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

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

命名空間namespace在C++、C#里面是一個(gè)常見(jiàn)概念,Swift中也引入了這樣一個(gè)機(jī)制,下面來(lái)探索一下這個(gè)命名空間的來(lái)龍去脈。

一、為什么需要命名空間

簡(jiǎn)而言之一句話:為了避免命名的沖突

在開(kāi)發(fā)中,尤其是在多模塊開(kāi)發(fā)中,很難保證模塊之間的類名不會(huì)重復(fù),為了保證不同模塊下同名的類可以正常使用而不報(bào)錯(cuò),引入命名空間來(lái)保證即使創(chuàng)建的類名一樣,只要命名空間不一樣,這些類也是不一樣的,所以,這是一種安全機(jī)制,用命名空間來(lái)防止沖突??梢钥闯觯琒wift中的類名的完整形式其實(shí)是“命名空間+類名”。我們可以嘗試在類中打印當(dāng)前類來(lái)查看一下完整名字:

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

二、命名空間查看與修改

從上面的打印結(jié)果來(lái)看,命名空間是我們項(xiàng)目的名字,那么如果查看呢?我們需要用源代碼的形式打開(kāi)Info.plist,可以看到里面有一個(gè)字段CFBundleExecutable,它對(duì)應(yīng)的值就是命名空間。

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

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

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

四、命名空間在開(kāi)發(fā)中的使用

開(kāi)發(fā)中有一種常見(jiàn)的情形,就是自定義TabBarController,然后在里面添加一個(gè)個(gè)子控制器,這里面常常存在一個(gè)問(wèn)題:通過(guò)一個(gè)控制器名(字符串)來(lái)創(chuàng)建一個(gè)控制器(類)。下面對(duì)比一下Objective-C與Swift兩種語(yǔ)言的實(shí)現(xiàn)方式。

由于Objective-C中沒(méi)有命名空間,所以寫(xiě)起來(lái)很輕松。

//viewDidLoad中添加一個(gè)個(gè)控制器
- (void)viewDidLoad {
 [super viewDidLoad];
 [self addNavigationChildVC:@"ContactViewController" :@"聯(lián)系人" :@"tabbar_contacts" :@"tabbar_contactsHL"];
}

//自定的方法中根據(jù)傳進(jìn)來(lái)的字符串創(chuàng)建控制器
-(void)addNavigationChildVC: (NSString *) vcName :(NSString *)title :(NSString *)nomalImageName :(NSString *)selectedImageName {
 //創(chuàng)建控制器
 Class class = NSClassFromString(vcName);
 UIViewController *vc = [[class alloc]init];
 ...
}

Swift中命名空間的存在,如果按照上述做法得不到想要的結(jié)果,這時(shí)候就需要想辦法進(jìn)行處理

//viewDidLoad中添加一個(gè)個(gè)控制器
override func viewDidLoad() {
 super.viewDidLoad()
 addChildViewController(vcName: "ContactsViewController", title: "聯(lián)系人", image: "tabbar_contacts", selectedImage: "tabbar_contactsHL")
}

//創(chuàng)建一個(gè)函數(shù)來(lái)將控制器的名字轉(zhuǎn)成具體的類
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
 } 
 //轉(zhuǎn)換成UIViewController
 guard let vcType = vcClass as? UIViewController.Type else {
  print("轉(zhuǎn)換失敗")
  return nil
 } 
 //根據(jù)類型創(chuàng)建對(duì)應(yīng)的控制器
 let vc = vcType.init()
 return vc
}

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 使用Swift實(shí)現(xiàn)iOS App中解析XML格式數(shù)據(jù)的教程

    使用Swift實(shí)現(xiàn)iOS App中解析XML格式數(shù)據(jù)的教程

    這篇文章主要介紹了使用Swift實(shí)現(xiàn)iOS App中解析XML格式數(shù)據(jù)的教程,講到了iOS中提供的NSXMLParser和NSXMLParserDelegate兩個(gè)API的用法,需要的朋友可以參考下
    2016-04-04
  • RxSwift學(xué)習(xí)教程之類型對(duì)象Subject詳解

    RxSwift學(xué)習(xí)教程之類型對(duì)象Subject詳解

    這篇文章主要給大家介紹了關(guān)于RxSwift學(xué)習(xí)教程之類型對(duì)象Subject的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起看看吧。
    2017-09-09
  • Swift利用CoreData實(shí)現(xiàn)一個(gè)通訊錄存儲(chǔ)詳解

    Swift利用CoreData實(shí)現(xiàn)一個(gè)通訊錄存儲(chǔ)詳解

    這篇文章主要給大家介紹了關(guān)于Swift利用CoreData實(shí)現(xiàn)一個(gè)通訊錄存儲(chǔ)的相關(guān)資料,本文是大家學(xué)習(xí)coreDate的基礎(chǔ)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • swift where與匹配模式的實(shí)例詳解

    swift where與匹配模式的實(shí)例詳解

    這篇文章主要介紹了swift where與匹配模式的實(shí)例詳解的相關(guān)資料,這里附有簡(jiǎn)單的示例代碼,講的比較清楚,需要的朋友可以參考下
    2017-07-07
  • swift實(shí)現(xiàn)簡(jiǎn)易計(jì)算器項(xiàng)目

    swift實(shí)現(xiàn)簡(jiǎn)易計(jì)算器項(xiàng)目

    這篇文章主要為大家詳細(xì)介紹了swift實(shí)現(xiàn)簡(jiǎn)易計(jì)算器項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Swift調(diào)用Objective-C代碼

    Swift調(diào)用Objective-C代碼

    目前Swift語(yǔ)言所編寫(xiě)的應(yīng)用才剛剛可以使用Xcode 6 GM版本提交,而Objective-C作為蘋(píng)果的主開(kāi)發(fā)語(yǔ)言存在了很多年了。目前尚無(wú)成熟的Swift庫(kù)可用,所以當(dāng)前編寫(xiě)應(yīng)用可以說(shuō)基本離不開(kāi)調(diào)用Objective-C代碼的情況。
    2014-09-09
  • mac git xcrun error active developer path 錯(cuò)誤

    mac git xcrun error active developer path 錯(cuò)誤

    本文主要是講訴了如何解決在mac下使用git;xcode4.6的環(huán)境時(shí),出現(xiàn)了錯(cuò)誤(mac git xcrun error active developer path)的解決辦法,希望對(duì)大家有所幫助
    2014-09-09
  • SwiftUI 登錄界面布局實(shí)現(xiàn)示例詳解

    SwiftUI 登錄界面布局實(shí)現(xiàn)示例詳解

    這篇文章主要為大家介紹了SwiftUI 登錄界面布局實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • SwiftUI中TabView組件的常規(guī)使用

    SwiftUI中TabView組件的常規(guī)使用

    這篇文章主要給大家介紹了關(guān)于SwiftUI中TabView組件的常規(guī)使用,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SwiftUI具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-06-06
  • Swift中的指針操作詳解

    Swift中的指針操作詳解

    從傳統(tǒng)的C代碼和與之無(wú)縫配合的Objective-C代碼遷移到Swift并非小工程,我們的代碼庫(kù)肯定會(huì)時(shí)不時(shí)出現(xiàn)一些和C協(xié)作的地方,如果想要繼續(xù)使用那些C API的話,了解一些基本的Swift指針操作和使用的知識(shí)會(huì)很有幫助。下面通過(guò)這篇文章一起來(lái)學(xué)習(xí)下吧。
    2017-01-01

最新評(píng)論

威信县| 大石桥市| 四川省| 阿克苏市| 商都县| 咸丰县| 东兰县| 嫩江县| 小金县| 县级市| 甘德县| 太谷县| 融水| 两当县| 宝丰县| 巴楚县| 大方县| 砚山县| 津南区| 唐河县| 台中县| 哈尔滨市| 确山县| 长岛县| 昭觉县| 德昌县| 库尔勒市| 班玛县| 筠连县| 白沙| 钦州市| 伊春市| 潮安县| 什邡市| 邵阳县| 新津县| 嘉黎县| 宜宾县| 绥江县| 松原市| 漳平市|