元类型是指任意类型的类型,包括类类型、结构体类型、枚举类型和协议类型。
类、结构体或枚举类型的元类型是相应的类型名紧跟 .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