Swift命名空间动态获取并加载类

来源:互联网 发布:关口知宏对中国的感觉 编辑:程序博客网 时间:2024/06/08 14:35

命名空间

OC中没有命名空间的概念,在进行应用开发时,所有的代码和引用的静态库最终会被编译到同一个域和二进制文件中.这样当两个类名重复的时候,就会导致编译冲突和失败.这也就是为什么我们在写OC代码的时候要添加类名前缀的原因.比如苹果本身保留的前缀UI和NS 还有各个系统框架的前缀SK(StoreKit),CG(CoreGraphic)等,这样做可以大大降低引起冲突的几率,但是风险仍然存在,如果你在项目中同时加载进两个不同的库,而这两个库都分别引用了同一个第三方库而没有修改名字,这样就会发生冲突

Swift由于命名空间的存在,既是两个名称相同的类,只要他们来自不同的命名空间就不会产生编译时的冲突

"在 Swift 中,由于可以使用命名空间了,即使是名字相同的类型,只要是来自不同的命名空间的话,都是可以和平共处的。和 C# 这样的显式在文件中指定命名空间的做法不同,Swift 的命名空间是基于 module 而不是在代码中显式地指明,每个 module 代表了 Swift 中的一个命名空间。也就是说,同一个 target 里的类型名称还是不能相同的。在我们进行 app 开发时,默认添加到 app 的主 target 的内容都是处于同一个命名空间中的,我们可以通过创建 Cocoa (Touch) Framework 的 target 的方法来新建一个 module,这样我们就可以在两个不同的 target 中添加同样名字的类型了. -----摘录来自: Unknown. “介绍”。 iBooks. "

在Swift中,类名的格式是: namespace.类名    默认情况下命名空间的名字就是我们的项目名称,我们可以在控制器中打印self,打印结果:


如何查看命名空间

命名空间的查看可以通过打印或者在Build Setting 中查找ProductName  如图



可以在这里修改命名空间的名称,但是要注意,新修改的命名空间不能有中文,不能以数字开头并且不能包含"-"符号

动态获取命名空间

由于命名空间可以修改,所以项目中单纯的用项目名称代替命名空间的做法并不可靠. 为了满足项目中某些需求,比如:活动期间需要显示与平时完全不同风格的界面,活动结束后又要修改回来,我们不可能在短期连发两个版本,这个就需要跟后台就行互动,将类名提前预留在后台,程序里面使用动态加载类来实现

 <span style="white-space:pre"></span>//通过info.plist文件的CFBundleExecutable键获得命名空间的名称        let nameSpace = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String
        //通过NSClassFromString将拼接完整的类名字符串转换为类  childControllerName为控制器名称        let cls:AnyClass = NSClassFromString(nameSpace + "." + childControllerName)!
        //告诉编译器类的真实类型 得到相应的控制器        let vcCls = cls as! UIViewController.Type
        // 实例化控制器        let vc = vcCls.init()
这样就可以动态的获取一个控制器并使用了
0 0
原创粉丝点击