什么是元类型 「Metatype」
元类型是指任何类型的的类型,包括类类型、结构体类型、枚举类型和协议类型。
类、结构体或枚举类型的元类型,在该类型的名称后面跟 .Type
;协议类型的元类型,是该协议名称后跟 .Protocol
。
如:
类类型 SomeClass 的元类型是 SomeClass.Type;
协议 SomeProtocol 的元类型是 SomeProtocol.Protocol
可以使用后缀 .self
表达式将类型作为值访问。
如:
SomeClass.self 返回 SomeClass 本身,而不是 SomeClass 的实例。
SomeProtocol.self 返回的是 SomeProtocol 本身,而不是在运行时符合 SomeProtocol 的类型的实例。
|
type(of:)
解析
返回的是 Metatype
的实例,也就是一个具体的类型,用这个返回的类型,我们可以调用它的构造器或者静态属性或者方法。它返回的是一个值的动态类型。
使用初始化表达式从该类型的元类型值构造一个类型的实例。对于类类型,被调用的初始化构造器必须使用 required
关键字或整个类用 final 关键字标记。
|
类型 VS 元类型
两者的区别在于:元类型的值为类型,用类型名加上 .self
表示。而类型的值为该类型的实例对象。
如: Int.Type
的值为 Int.self
, Int
的值可以为任意整数。
|
Note: SomeType.self
& SomeProtocol.self
表示元类型的值,而 someInstance.self
表示该实例对象本身
AnyClass
AnyClass
其实就是任意类类型的元类型。AnyClass
是 AnyObject.Type
的别名,而 AnyObject
是任何 class
都会默认实现的协议。
public typealias AnyClass = AnyObject.Type |
元类型的应用场景
- 我们经常用到的
UITableView
&UICollectionView
中 cell 的注册方法
|
- 我们平常在使用
工厂模式
时的对产品类型实例的创建方法。例如