【问题标题】:Metatype of Metatype元类型的元类型
【发布时间】:2016-10-04 05:44:28
【问题描述】:

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

【问题讨论】:

  • 结构体的元类型(例如String.self)也不符合AnyObject
  • 我不是 100% 确定您在问什么,但我已尝试回答(或至少部分回答)您的问题。
  • 嘿影子,我为你的问题添加了赏金。看看能不能得到一些更详细的答案

标签: swift


【解决方案1】:

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

我会尝试剖析您的要求。

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

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

元类型

表示类型的值的类型。格雷格帕克有一个很好的 Objective-C's "metaclasses" 的解释,因为 Swift 有类型 不是类的,使用更通用的术语。

我们有时也将表示类型的值称为“元类型” 对象”或只是“元类型”,通常在像 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 上)。

【讨论】:

  • 谢谢你的回答,这让事情变得清晰了一点。我还是不明白,为什么SomeClass 符合AnyObjectSomeClass.Type 符合AnyObject,但SomeClass.Type.Type - 不是?
  • @ShadowOf 如果我不得不猜测的话,可能是因为元类型的元类型是 Any 类型,而不是 AnyObject。为什么,我不太确定。我现在不在电脑旁,但我回来后会做更多调查。
  • @ShadowOf 你确定SomeClass.Type 符合AnyObject 吗? SomeClass.Type as! AnyObject 导致我崩溃。
  • 是的,我确定:let metaMetatype: SomeClass.Type = SomeClass.self; print(metaMetatype as AnyObject) 打印 metaMetatype 描述
【解决方案2】:

类的类型也在内存中表示(例如它有自己的方法)。它由表示类型的单例表示。 (它不是这种类型的一个实例——那是不同的东西)。如果您在 SomeClass.self 这样的类型上调用 self,您将获取表示 SomeClass 类型的单例实例。

更多信息请查看answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 2020-06-04
    • 2012-06-09
    • 2020-02-07
    • 2023-04-01
    • 1970-01-01
    • 2013-06-15
    相关资源
    最近更新 更多