swift中,类名的组成格式是 namespace.类名
创建项目test 在viewDidLoad()方法中创建几个控制器,打印控制器对象
override func viewDidLoad() {
super.viewDidLoad()
let homeVc = HomeViewController()
let messageVc = MessageViewController()
let disCoverVc = DiscoverViewController()
let profileVc = ProfileViewController()
print(homeVc,messageVc,disCoverVc,profileVc)
}
打印结果如下
test就是命名空间 默认的就是项目名称,同一个命名空间全局共享,这也就是为什么Swift 不需要再Improt 头文件
查看nameSpace
namespace在info.plist 对应的key是 CFBundleExecutable,
可以在info.plist中任意右击一行,选中Show Raw Keys/Values查看真实的key,如图
修改nameSpace
如果新建项目时,项目名称中包含有中文,可以进入Build Settings中选中"All", 搜索product name,即可修改,如图:
注意 新改的名字不能含有
中文
,不能以数字
开头,不能有-
,不要带有swift 否则会出现奇怪的问题,或者以类名创建类(NSClassFromString)的时候会返回nil
通过代码获取命名空间名称,并创建相应的类
override func viewDidLoad() {
super.viewDidLoad()
//加载Json文件路径
let path = NSBundle.mainBundle().pathForResource("VCSettings.json", ofType: nil)
// 可选绑定
if let jsonPath = path {
//加载data
data = NSData(contentsOfFile: jsonPath)
do {
//创建字典数组
let dictArr = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! [[String: String]]
//获取命名空间
let spaceName = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String
//便利字典数组
for dict in dictArr {
//拼接类名的完整格式,即namespace.类名,vcName即控制器的类名
let vcName = spaceName + "." + dict["vcName"]!
let vcClass: AnyClass? = NSClassFromString(vcName)
let vcType = vcClass as! UIViewController.Type
//创建控制器对象
let vc = vcType.init()
}
}catch {
//
let homeVc = HomeViewController()
let messageVc = MessageViewController()
let disCoverVc = DiscoverViewController()
let profileVc = ProfileViewController()
}
}
}