元类型的元型

时间:2016-09-01 12:34:17

标签: swift

在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不是对象,那是什么,以及为什么我们能够声明它?

2 个答案:

答案 0 :(得分:9)

  

如果SomeClass.Type.Type不是对象,那么这是什么以及为什么我们能够声明它?

我会尝试剖析你所问的内容。

SomeClass.Type.Type是元元型的元型。 Swift中存在元类型,因为Swift的类型不是类。这与Objective-C中的Metaclass概念最相似。

Swift开源回购中的

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

请注意,nsObjnsObj.self相同,代表NSObject的实例。

我不知道Swift模块或开源代码库中哪些类型允许.Type,但我还在寻找。它可能与SwiftObject的继承有关,SwiftObject是所有Swift类继承的Objective-C对象(至少在Mac上)。

答案 1 :(得分:0)

类的类型也在内存中表示(例如它有自己的方法)。它由表示Type的单例表示。 (它不是这种类型的实例 - 这是不同的东西)。如果你在类似SomeClass.self的类型上调用self,你将使用表示SomeClass类型的单例实例。

有关详细信息,请查看此answer