在Swift中,我们可以编写以下结构:
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
不是对象,那是什么,以及为什么我们能够声明它?
答案 0 :(得分:9)
如果
SomeClass.Type.Type
不是对象,那么这是什么以及为什么我们能够声明它?
我会尝试剖析你所问的内容。
SomeClass.Type.Type
是元元型的元型。 Swift中存在元类型,因为Swift的类型不是类。这与Objective-C中的Metaclass概念最相似。
Lexicon.rst有一个很好的解释:
元类型
表示类型的值的类型。格雷格帕克有一个很好的 解释Objective-C's "metaclasses"因为Swift有类型 那些不是类,使用了更通用的术语。
我们有时也会将表示类型的值称为"元类型 对象"或者只是" metatype",通常在像IRGen这样的低级环境中 和LLDB。这在技术上是不正确的(它只是一个"类型的对象"),但是 在项目的早期发生了麻木病,并且一直困扰着。
为什么我们能够声明一种类型的类型......等等?因为它是称为类型元数据的语言的一个特征:
输入元数据
类型的运行时表示,以及您可以使用它执行的所有操作。 与Objective-C中的
Class
类似,但适用于任何类型。
请注意,您无法在Swift中执行NSObject().class
之类的操作,因为class
是用于创建类的保留关键字。这就是你如何在Swift中获得NSObject的类型(或本例中的类):
let nsObj = NSObject()
nsObj.classForCoder // NSObject.Type
nsObj.classForKeyedArchiver // NSObject.Type
nsObj.dynamicType // NSObject.Type
请注意,nsObj
和nsObj.self
相同,代表NSObject
的实例。
我不知道Swift模块或开源代码库中哪些类型允许.Type
,但我还在寻找。它可能与SwiftObject的继承有关,SwiftObject是所有Swift类继承的Objective-C对象(至少在Mac上)。
答案 1 :(得分:0)
类的类型也在内存中表示(例如它有自己的方法)。它由表示Type的单例表示。 (它不是这种类型的实例 - 这是不同的东西)。如果你在类似SomeClass.self的类型上调用self,你将使用表示SomeClass类型的单例实例。
有关详细信息,请查看此answer