• 12.代码获取命名空间名称,并创建相应的类(anyClass 应用)


    // 从info.plist读取namespace
    let namespace = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String
    // 拼接类名的完整格式,即namespace.类名,vcName即控制器的类名
    let clsName = namespace + "." + vcName
    let cls: AnyClass = NSClassFromString(clsName)!
    // 得到相应的控制器
    let vc = cls.alloc() as! UITableViewController
    

    AnyObject------任意类实例

    AnyClass-------任意类型本身

    typealias AnyClass = AnyObject.Type

         通过 AnyObject.Type 这种方式所得到是一个元类型 (Meta)。在声明时我们总是在类型的名称后面加上 .Type,比如 A.Type 代表的是 A 这个类型的类型。也就是说,我们可以声明一个元类型来存储 A 这个类型本身,而在从 A 中取出其类型时,我们需要使用到 .self

    class A { }

    let typeA: A.Type = A.self

    这样,要是 A 中有一个类方法时,我们就可以通过 typeA 来对其进行调用了:

    class A {
        class func method() {
            print("Hello")
        }
    }
    
    let typeA: A.Type = A.self
    typeA.method()
    
    // 或者
    let anyClass: AnyClass = A.self
    (anyClass as! A.Type).method()


    class MusicViewController: UIViewController {
    
    }
    
    class AlbumViewController: UIViewController {
    
    }
    
    let usingVCTypes: [AnyClass] = [MusicViewController.self,
        AlbumViewController.self]
    
    func setupViewControllers(vcTypes: [AnyClass]) {
        for vcType in vcTypes {
            if vcType is UIViewController.Type {
                let vc = (vcType as! UIViewController.Type).init()
                print(vc)
            }
    
        }
    }
    
    setupViewControllers(usingVCTypes)
    
    另外,在 Cocoa API 中我们也常遇到需要一个 AnyClass 的输入,这时候我们也应该使用 .self 的方式来获取所需要的元类型,例如在注册 tableView 的 cell 的类型的时候:
    
    self.tableView.registerClass(
        UITableViewCell.self, forCellReuseIdentifier: "myCell")
     
    爱code的妖妖
  • 相关阅读:
    string与bytes相互转化
    python3之requests
    BeyondCompare3提示许可密钥过期完美解决方法
    windows环境下 curl 安装和使用
    Linux:PS命令详解与使用
    wireshark怎么抓包、wireshark抓包详细图文教程
    七层协议和四层协议
    linux中快速清空文件内容的几种方法
    python_02列表,字典,IO处理
    python_01
  • 原文地址:https://www.cnblogs.com/yaoyao0110/p/5532798.html
Copyright © 2020-2023  润新知