gpt4 book ai didi

swift - 元类型的元类型

转载 作者:IT王子 更新时间:2023-10-29 05:06:15 25 4
gpt4 key购买 nike

在 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 中的 Metaclass 概念最相似。

Lexicon.rst在 Swift Open Source Repo 中有一个很好的解释:

metatype

The type of a value representing a type. Greg Parker has a good explanation of Objective-C's "metaclasses" 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().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 上是这样)。

关于swift - 元类型的元类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39271721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com