###1.何为命名空间 OC中没有命名空间的概念,在进行应用开发时,全部的代码和引用的静态库最终会被编译到同一个域和二进制文件中。这样当两个类名重复的时候,就会致使编译冲突和失败。这也就是为何咱们在写OC代码的时候要添加类名前缀的缘由。好比苹果自己保留的前缀UI和NS 还有各个系统框架的前缀AF、SD等,这样作能够大大下降引发冲突的概率,可是风险仍然存在,若是你在项目中同时加载进两个不一样的库,而这两个库都分别引用了同一个第三方库而没有修更名字,这样就会发生冲突。 Swift因为命名空间的存在,既是两个名称相同的类,只要他们来自不一样的命名空间就不会产生编译时的冲突。 "在 Swift 中,因为可使用命名空间了,即便是名字相同的类型,只要是来自不一样的命名空间的话,都是能够和平共处的。和 C# 这样的显式在文件中指定命名空间的作法不一样,Swift 的命名空间是基于 module 而不是在代码中显式地指明,每一个 module 表明了 Swift 中的一个命名空间。也就是说,同一个 target 里的类型名称仍是不能相同的。在咱们进行 app 开发时,默认添加到 app 的主 target 的内容都是处于同一个命名空间中的,咱们能够经过建立 Cocoa (Touch) Framework 的 target 的方法来新建一个 module,这样咱们就能够在两个不一样的 target 中添加一样名字的类型了。 在swift中类名的组成格式是 namespace.类名。好比咱们在任意一个控制器的viewDidLoad()方法中打印self,打印结果是: swift
###2.若是查看命名空间 swift中命名空间默认为项目的名称,具体查看的办法为在info.plist文件中,键名为"CFBundleExecutable"的字符串: app
###3如何更改命名空间 框架
###4命名空间对动态加载类的影响(本人如今只接触过这一个😜) 在oc中咱们想要动态的建立一个类的作法是,直接经过字符串穿件类,以下:ui
NSString *classNameStr = @"className";
id object = [[NSClassFromString(classNameStr) alloc]init];
复制代码
可是在swift中因为命名空间的存在,若是还用上面的方法经过字符串动态的建立类是不能够的(获得的会是空)。swift经过字符串动态的建立类咱们须要在字符串的前面加上 ”命名空间.“(没有双引号,可是有点),具体以下:spa
let classNameStr = "classNameStr"
//动态得到命名空间
let name = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String
//这里以控制器为例
let vc:AnyClass? = NSClassFromString(name + "." + classNameStr)
if let vc = vc {
let nameVc = vc as! UIViewController.Type
//nameVc就是经过字符串动态加载后的类,咱们能够经过他建立新的实例
let newObject = nameVc.init()
}
复制代码