元类型的元型

Sha*_* Of 27 swift

在Swift中,我们可以编写以下结构:

class SomeClass {}
let metaMetatype: SomeClass.Type.Type = SomeClass.Type.self
Run Code Online (Sandbox Code Playgroud)

这里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
Run Code Online (Sandbox Code Playgroud)

这个结构有什么意义吗?如果SomeClass.Type.Type不是一个对象,这是什么,为什么我们能够声明它?

JAL*_*JAL 9

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

我会试着剖析你所问的问题.

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

Swift开源Repo中的Lexicon.rst有一个很好的解释:

元类型

表示类型的值的类型.Greg Parker对Objective-C的"元类"有很好的解释,因为Swift的类型不是类,而是使用了更通用的术语.

我们有时也会将表示类型的值称为"元类型对象"或仅仅是"元类型",通常在IRGen和LLDB等低级上下文中.这在技术上是不正确的(它只是一个"类型对象"),但是malapropism发生在项目的早期并且一直存在.

为什么我们能够声明一种类型的类型......等等?因为它是称为类型元数据的语言的一个特性:

类型元数据

类型的运行时表示,以及您可以使用它执行的所有操作.就像Class在Objective-C中一样,但对于任何类型.

请注意,您无法NSObject().class在Swift中执行某些操作,因为它class是用于创建类的保留关键字.这是你如何在Swift中获得NSObject的类型(或本例中的类):

let nsObj = NSObject()
nsObj.classForCoder // NSObject.Type
nsObj.classForKeyedArchiver // NSObject.Type
nsObj.dynamicType // NSObject.Type
Run Code Online (Sandbox Code Playgroud)

需要注意的是nsObjnsObj.self是相同的,代表的是实例NSObject.

我没有看到Swift模块中的位置或类型允许的开源仓库.Type,但我仍然在寻找.它可能与SwiftObject的继承有关,SwiftObject是所有Swift类继承的Objective-C对象(至少在Mac上).