Swift学习之通过字符串创建对象

  • 一、swift的空间命名机制
    在 Swift 中,由于可以使用命名空间了,即使是名字相同的类型,只要是来自不同的命名空间的话,都是可以和平共处的。在 Swift 中,由于可以使用命名空间了,即使是名字相同的类型,只要是来自不同的命名空间的话,都是可以和平共处的。


    2457121-52a1606627c5f940.jpg
    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)
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_34109408/article/details/87223251