之前接触学习swift
是2的版本,由于长时间不用,所以一些基本的用法都忘记了,最近项目不是很忙又重新学习swift4
,刚开始就遇到一个问题,oc中大家可能都知道从字符串获取类名NSClassFromString
,oc
中直接传入字符串就会得到一个类名但是swift中用法就显得复杂一些,swift
有一个命名空间的存在,虽然说官方并没有说支持nameSpace
,但是有module
或者target
来实现nameSpace
相似的功能,
xcode中每建立一个target
可以当做是一个模块(module),target和 bundle名称一致,但是有一个很操蛋的情况,我们target名称包含"-"
的时候,会得不到类,系统会自动的把"-"
替换为"_"
,原来的名称xx-xx-xx
,被转换为了xx_xx_xx
,所以当项目名称中包含"-"时,使用NSClassFromString
的时候要把获取到的target
中的"-"
替换为"_"
,不过一些特殊字符最好不要用,以免出现各种不好找的bug
func getVCByClassString(_ childControllerName: String) -> UIViewController?{
// 1.获取命名空间
var nameSpage = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String
nameSpage = nameSpage.replacingOccurrences(of: "-", with: "_");
guard let childVcClass = NSClassFromString(nameSpage + "." + childControllerName) else {
print("没有获取到对应的class")
return nil;
}
guard let childVcType = childVcClass as? UIViewController.Type else {
print("没有得到的类型")
return nil;
}
//根据类型创建对应的对象
let vc = childVcType.init()
return vc
}
func getVCByClassString(_ childControllerName: String) -> UIViewController?{
guard let nameSpage = Bundle.main.infoDictionary!["CFBundleExecutable"] as? String else {
print("没有命名空间")
return nil;
}
guard let childVcClass = NSClassFromString(nameSpage + "." + childControllerName) else {
print("没有获取到对应的class")
return nil;
}
guard let childVcType = childVcClass as? UIViewController.Type else {
print("没有得到的类型")
return nil;
}
//根据类型创建对应的对象
let vc = childVcType.init()
return vc
}
网友评论