欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Swift中的命名空間詳解

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

前言

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 里的類型名稱還是不能相同的。

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

一、為什么需要命名空間

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

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

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

二、命名空間查看與修改

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

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

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

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

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

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

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

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

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

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

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

//創(chuàng)建一個函數(shù)來將控制器的名字轉成具體的類
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
 } 
 //根據(jù)類型創(chuàng)建對應的控制器
 let vc = vcType.init()
 return vc
}

總結

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

相關文章

  • 詳解Swift面向對象編程中的方法(method)

    詳解Swift面向對象編程中的方法(method)

    既然面向對象那就一定會有method,方法和面向過程語言中的function函數(shù)并沒什么區(qū)別,只不過方法在面向對象語言中可以被類來約束作用域,這里我們就來詳解Swift面向對象編程中的方法(method)
    2016-07-07
  • 在Swift中如何使用正則表達式詳解

    在Swift中如何使用正則表達式詳解

    正則表達式是對字符串操作的一種邏輯公式,相信大家應該都不陌生,下面這篇文章主要給大家介紹了關于在Swift中如何使用正則表達式的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-09-09
  • swift 可選型的使用詳解

    swift 可選型的使用詳解

    可選性是Swift提供的一個特殊類型,它為我們編寫程序提供便利的條件。這篇文章主要介紹了swift 可選型的使用詳解,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • Swift 3中使用FMDB遇到的問題與解決方法

    Swift 3中使用FMDB遇到的問題與解決方法

    相信大家都熟悉OC使用FMDB第三方庫,進行數(shù)據(jù)庫操作,增、刪、改、查,但最近在Swift 3中使用FMDB遇到了一些問題,下面這篇文章主要給大家介紹了關于在Swift 3中使用FMDB遇到的問題與解決方法,需要的朋友可以參考下。
    2017-07-07
  • 深入探究Swift枚舉關聯(lián)值的內存

    深入探究Swift枚舉關聯(lián)值的內存

    這篇文章主要給大家介紹了關于Swift枚舉關聯(lián)值的內存的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用Swift具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-08-08
  • iOS中Swift指觸即開集成Touch ID指紋識別功能的方法

    iOS中Swift指觸即開集成Touch ID指紋識別功能的方法

    隨著移動支付時代的到來,Touch ID 指紋驗證迅速被支付寶,微信錢包普及,相信各位朋友使用后也大呼方便。下面給大家分享iOS中Swift指觸即開集成Touch ID指紋識別功能的方法,一起看看吧
    2017-03-03
  • Swift中的條件判斷、循環(huán)、跳轉語句基礎學習筆記

    Swift中的條件判斷、循環(huán)、跳轉語句基礎學習筆記

    if、for和while循環(huán)、switch等這些基本的程序流程控制語句基本上是每個編程語言的標配,在入門環(huán)節(jié)中,這里對Swift中的條件判斷、循環(huán)、跳轉語句基礎學習筆記作了一個整理:
    2016-06-06
  • Swift教程之控制流詳解

    Swift教程之控制流詳解

    這篇文章主要介紹了Swift教程之控制流詳解,本文詳細講解了Swift中的for循環(huán)、for-in循環(huán)、For-Condition-Increment條件循環(huán)、while循環(huán)、Do-while循環(huán)、if條件語句等控制流語句,需要的朋友可以參考下
    2015-01-01
  • Swift編程中的switch...case語句實例解析

    Swift編程中的switch...case語句實例解析

    這篇文章主要介紹了Swift編程中的switch...case語句實例解析,其中重點還是對于fallthrough關鍵字用法的講解,需要的朋友可以參考下
    2016-04-04
  • swift學習文檔(筆記)

    swift學習文檔(筆記)

    這篇文章主要介紹了學習swift的筆記,swift最近也比較熱,需要的朋友可以參考下
    2014-09-09

最新評論