在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不是一个对象,这是什么,为什么我们能够声明它?
如果
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)
需要注意的是nsObj和nsObj.self是相同的,代表的是实例NSObject.
我没有看到Swift模块中的位置或类型允许的开源仓库.Type,但我仍然在寻找.它可能与SwiftObject的继承有关,SwiftObject是所有Swift类继承的Objective-C对象(至少在Mac上).
| 归档时间: |
|
| 查看次数: |
693 次 |
| 最近记录: |