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的妖妖
原文地址:https://www.cnblogs.com/yaoyao0110/p/5532798.html