Swift命名空间动态获取并加载类
2016-02-25 09:14
183 查看
命名空间
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()这样就可以动态的获取一个控制器并使用了
相关文章推荐
- Android Native 绘图方法
- Apple Swift学习教程
- 介绍 Fedora 上的 Swift
- C#中struct和class的区别详解
- VBS ArrayList Class vbs中的数组类
- 大家看了就明白了css样式中类class与标识id选择符的区别小结
- C++编程中的命名空间基本知识讲解
- 深入了解PHP类Class的概念
- jquery 表单验证之通过 class验证表单不为空
- C++命名空间实例解析
- php命名空间学习详解
- setAttribute 与 class冲突解决
- JavaScript中的类(Class)详细介绍
- javascript面向对象包装类Class封装类库剖析
- js命名空间写法示例
- JavaScript创建命名空间的5种写法
- Javascript学习笔记之函数篇(六) : 作用域与命名空间
- 详解js中class的多种函数封装方法
- jQuery使用hide方法隐藏指定元素class样式用法实例