美文网首页
Swift学习之通过字符串创建对象

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

作者: coderhlt | 来源:发表于2019-01-15 10:17 被阅读34次
    • 一、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)
        }
    }
    

    相关文章

      网友评论

          本文标题:Swift学习之通过字符串创建对象

          本文链接:https://www.haomeiwen.com/subject/urvcdqtx.html