-
一、swift的空间命名机制
在 Swift 中,由于可以使用命名空间了,即使是名字相同的类型,只要是来自不同的命名空间的话,都是可以和平共处的。在 Swift 中,由于可以使用命名空间了,即使是名字相同的类型,只要是来自不同的命名空间的话,都是可以和平共处的。
1547289823384.jpg
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print(self)
print(MyView())
print(Student())
}
}
控制台输出:
<Test.ViewController: 0x7ff4aec11260>
<Test.MyView: 0x7ff4aef23b60; frame = (0 0; 0 0); layer = <CALayer: 0x600001880ec0>>
<Test.Student: 0x600001ad72f0>
因此我们通过字符串创建一个对象时需要给字符串添加空间命名
二、通过字符串创建对象
在oc中,是通过NSClassFromString(@"ViewController")创建的
- (void)viewDidLoad {
[super viewDidLoad];
UIViewController *vc = NSClassFromString(@"ViewController");
NSLog(@"%@",vc);
}
@end
在swift 中,也是是通过NSClassFromString(@"ViewController")创建的。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//1. 字符串转AnyClass
let a:AnyClass? = NSClassFromString("Test"+"."+"ViewController")
//2. 告诉系统Class的类型
let b = a as! ViewController.Type
//3.通过得到的class类型创建对象
let c = b.init()
print(c)
}
}
//完整代码
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
guard let spaceName = Bundle.main.infoDictionary!["CFBundleExecutable"] else {
print("空间名字获取不到")
return
}
let clas:AnyClass? = NSClassFromString(spaceName as! String + "."+"ViewController")
guard let clastype = clas as? UIViewController.Type else {
return
}
let viewcontoller = clastype.init()
print(viewcontoller)
}
}
网友评论