在OC中将字符串转成类有NSClassFromString("ClassName")这个方法可以直接使用,但在swift中无法直接使用NSClassFromString,因此稍微麻烦些。
func classFromString(_ className:String) -> UIViewController{
//1、获swift中的命名空间名
var name = Bundle.main.object(forInfoDictionaryKey: "CFBundleExecutable") as? String
//2、如果包名中有'-'横线这样的字符,在拿到包名后,还需要把包名的'-'转换成'_'下横线
name = name?.replacingOccurrences(of: "-", with: "_")
//3、拼接命名空间和类名,”包名.类名“
let fullClassName = name! + "." + className
//通过NSClassFromString获取到最终的类,由于NSClassFromString返回的是AnyClass,这里要转换成UIViewController.Type类型
guard let classType = NSClassFromString(fullClassName) as? UIViewController.Type else{
fatalError("转换失败")
}
return classType.init()
}
注:在swift中有命名空间的概念了,在OC里没有命名空间这个概念,所以在Objective-C应用中的所有类名都必须是全局唯一的。
网友评论