swift-名稱空間/反射機制(Reflect)
Objective-C 一個一直以來令人詬病的地方就是沒有名稱空間,在應用開發時,所有的程式碼和引用的靜態庫最終都會被編譯到同一個域和二進位制中。這樣的後果是一旦我們有重複的類名的話,就會導致編譯時的衝突和失敗。
![1604092-d927180238c4d3cf.jpeg](https://i.iter01.com/images/7492d47efedede45087534aee7dfea5f3028523fd128c46b9826cbc1ca09649f.jpg)
為了避免這種事情的發生,Objective-C 的型別一般都會加上兩到三個字母的字首,比如 Apple 保留的 NS 和 UI 字首,各個系統框架的字首 SK (StoreKit),CG (CoreGraphic) 等。Objective-C 社群的大部分開發者也遵守了這個約定,一般都會將自己名字縮寫作為字首,把類庫命名為 AFNetworking 或者 MBProgressHUD 這樣。這種做法可以解決部分問題,至少我們在直接引用不同人的庫時衝突的概率大大降低了,但是字首並不意味著不會衝突,有時候我們確實還是會遇到即使使用字首也仍然相同的情況。另外一種情況是可能你想使用的兩個不同的庫,分別在它們裡面引用了另一個相同的很流行的第三方庫,而又沒有更改名字。在你分別使用這兩個庫中的一個時是沒有問題的,但是一旦你將這兩個庫同時加到你的專案中的話,這個大家共用的第三方庫就會和自己發生衝突了。
在 Swift 中,由於可以使用名稱空間了,即使是名字相同的型別,只要是來自不同的名稱空間的話,都是可以和平共處的。和 C# 這樣的顯式在檔案中指定名稱空間的做法不同,Swift 的名稱空間是基於 module 而不是在程式碼中顯式地指明,每個 module 代表了 Swift 中的一個名稱空間。也就是說,同一個 target 裡的型別名稱還是不能相同的。在我們進行 app 開發時,預設新增到 app 的主 target 的內容都是處於同一個名稱空間中的。
- 在swift 中存在名稱空間,同一名稱空間下全域性共享.
- 第三方框架使用:直接拖入專案中,從屬於一個名稱空間,很可能衝突(所以儘量用cocoapod)
- NSClassFromString(反射機制): 最重要的目的,就是解耦 。例子:(反射機制和工廠方法)
獲取名稱空間設定根控制器
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
window = UIWindow()
window?.backgroundColor = UIColor.white
let CFName = Bundle.main.infoDictionary?["CFBundleName"] as? String ?? ""
//點後面是所需 類名
// let vc = Bundle.main.nameSpace() + "." + "ViewController"
let vc = CFName + "." + "ViewController"
let vcType = NSClassFromString(vc) as? UIViewController.Type
window?.rootViewController = vcType?.init()
window?.makeKeyAndVisible()
return true
}
bundle的分類
![1604092-def943c75fdff3a7.png](https://i.iter01.com/images/95306698843c72ad86010384d450c74a7283645d066e78c6ae2b1b4a6750bccb.png)
相關文章
- Go反射機制ReflectGo反射
- 名稱空間
- JS 反射機制及 Reflect 詳解JS反射
- PHP名稱空間PHP
- PHP 名稱空間PHP
- 20200109 - 名稱空間
- python名稱空間Python
- vuex名稱空間Vue
- 15-名稱空間
- Python名稱空間包Python
- 11. 名稱空間
- ts---名稱空間
- C++名稱空間C++
- 使用p名稱空間和c名稱空間的XML快捷方式XML
- Python中名稱空間是什麼?名稱空間生命週期是多久?Python
- ros節點名稱空間ROS
- PHP 核心特性 - 名稱空間PHP
- Kubernetes 名稱空間入門
- 3-1 名稱空間
- 什麼是名稱空間?
- Go基礎學習記錄之反射(reflect)機制Go反射
- Python作用域和名稱空間Python
- spring框架中的名稱空間Spring框架
- System.Security.Cryptography 名稱空間
- c++系列:匿名名稱空間C++
- 內聯和巢狀名稱空間巢狀
- Python中名稱空間包簡介Python
- PHP 物件導向 (三)名稱空間PHP物件
- OpenCV 名稱空間學習筆記OpenCV筆記
- php名稱空間的呼叫順序PHP
- 瞭解下C# 名稱空間(Namespace)C#namespace
- C++系列: 巢狀名稱空間C++巢狀
- PHP 獲取不帶名稱空間的類名PHP
- yaml檔案中在哪加名稱空間?YAML
- Kubernetes 的層級名稱空間介紹
- Python3 名稱空間和作用域Python
- 自研 PHP 框架 1.1_名稱空間PHP框架
- 深入講解Python名稱空間規則!Python
- 對名稱空間的一點個人理解