class SomeClass {} let MetaMetatype: SomeClass.Type.Type = SomeClass.Type.self
这里的MetaMetatype不符合类型AnyObject(SomeClass.Type)。施工可以更长,只要我们希望:
let uberMetatype: SomeClass.Type.Type.Type.Type.Type.Type.Type.Type.Type.Type = SomeClass.Type.Type.Type.Type.Type.Type.Type.Type.Type.self
这个结构有什么意义吗?如果SomeClass.Type.Type不是一个对象,这是什么,为什么我们能够声明它?
If
@H_301_18@SomeClass.Type.Type
not an object,what is this and why we able to declare it?我会试图剖析你问的是什么。
SomeClass.Type.Type是元类型的元类型。元类型存在于Swift中,因为Swift具有不是类的类型。这最类似于Objective-C中的元类概念。
Lexicon.rst在Swift中的开源Repo有一个很好的解释:
Metatype
The type of a value representing a type. Greg Parker has a good
explanation of 07001 because Swift has types
that are not classes,a more general term is used.We also sometimes refer to a value representing a type as a “Metatype
@H_301_18@
object” or just “Metatype”,usually within low-level contexts like IRGen
and LLDB. This is technically incorrect (it’s just a “type object”),but
the malapropism happened early in the project and has stuck around.为什么我们能够声明一个类型的类型…等等?因为它是称为类型元数据的语言的一个特性:
type Metadata
The runtime representation of a type,and everything you can do with it.
@H_301_18@
Like aClass
in Objective-C,but for any type.注意,你不能像Swift中的NSObject()。类一样做,因为类是创建类的保留关键字。这是你将如何获得一个NSObject的类型(在这种情况下的类)在Swift:
let nsObj = NSObject() nsObj.classForCoder // NSObject.Type nsObj.classForKeyedArchiver // NSObject.Type nsObj.dynamicType // NSObject.Type注意,nsObj和nsObj.self是相同的,并且表示该NSObject的实例。
我看不到在Swift模块或开源代码在哪里类型允许.Type,但我仍然在寻找。它可能与SwiftObject的继承,Objective-C对象所有Swift类继承(至少在Mac上)。