// 从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")