31.11. 元类型

元类型是指任意类型的类型,包括类类型、结构体类型、枚举类型和协议类型。

类、结构体或枚举类型的元类型是相应的类型名紧跟 .Type。协议类型的元类型——并不是运行时遵循该协议的具体类型——是该协议名字紧跟 .Protocol。比如,类 SomeClass 的元类型就是 SomeClass.Type,协议 SomeProtocol 的元类型就是 SomeProtocal.Protocol

你可以使用后缀 self 表达式来获取类型。比如,SomeClass.self 返回 SomeClass 本身,而不是 SomeClass 的一个实例。同样,SomeProtocol.self 返回 SomeProtocol 本身,而不是运行时遵循 SomeProtocol 的某个类型的实例。还可以对类型的实例使用 type(of:) 表达式来获取该实例动态的、在运行阶段的类型,如下所示:

class SomeBaseClass {
    class func printClassName() {
        println("SomeBaseClass")
    }
}
class SomeSubClass: SomeBaseClass {
    override class func printClassName() {
        println("SomeSubClass")
    }
}
let someInstance: SomeBaseClass = SomeSubClass()
// someInstance 在编译期是 SomeBaseClass 类型,
// 但是在运行期则是 SomeSubClass 类型
type(of: someInstance).printClassName()
// 打印“SomeSubClass”

更多信息可以查看 Swift 标准库里的 type(of:)。

可以使用初始化表达式从某个类型的元类型构造出一个该类型的实例。对于类实例,被调用的构造器必须使用 required 关键字标记,或者整个类使用 final 关键字标记。

class AnotherSubClass: SomeBaseClass {
    let string: String
    required init(string: String) {
        self.string = string
    }
    override class func printClassName() {
        print("AnotherSubClass")
    }
}
let metatype: AnotherSubClass.Type = AnotherSubClass.self
let anotherInstance = metatype.init(string: "some string")

元类型语法

metatype-type

元类型 → 类型 . Type | 类型 . Protocol