元類型是指所有類型的類型,包括類、結(jié)構(gòu)體、枚舉和協(xié)議。
類、結(jié)構(gòu)體或枚舉類型的元類型是相應(yīng)的類型名緊跟.Type。協(xié)議類型的元類型——并不是運行時適配該協(xié)議的具體類型——是該協(xié)議名字緊跟.Protocol。比如,類SomeClass的元類型就是SomeClass.Type,協(xié)議SomeProtocol的元類型就是SomeProtocal.Protocol。
你可以使用后綴self表達式來獲取類型。比如,SomeClass.self返回SomeClass本身,而不是SomeClass的一個實例。同樣,SomeProtocol.self返回SomeProtocol本身,而不是運行時適配SomeProtocol的某個類型的實例。還可以對類型的實例使用dynamicType表達式來獲取該實例在運行階段的類型,如下所示:
class SomeBaseClass {
class func printClassName() {
println("SomeBaseClass")
}
}
class SomeSubClass: SomeBaseClass {
override class func printClassName() {
println("SomeSubClass")
}
}
let someInstance: SomeBaseClass = SomeSubClass()
// someInstance is of type SomeBaseClass at compile time, but
// someInstance is of type SomeSubClass at runtime
someInstance.dynamicType.printClassName()
// prints "SomeSubClass