swift – 元类型的元类型

前端之家收集整理的这篇文章主要介绍了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不是一个对象,这是什么,为什么我们能够声明它?

If 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
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.
Like a Class 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上)。

原文链接:https://www.f2er.com/swift/320755.html

猜你在找的Swift相关文章