转换为 Swift 中的元类型类型?

Cast to a Metatype Type in Swift?

你能转换成 Swift 中的元类型吗?看起来你真的应该能够(毕竟你可以从 Metatypes 实例化对象)。

以下无效:

class Super {}

class A : Super {}

let superA:Super = A()
let subType = superA.dynamicType
let afterCast = superA as subType 

//Compiler error: "use of undeclared type 'subType'"

有谁知道这样做的正确方法吗?

编辑:

正如 newacct 指出的那样,.dynamicType 的结果显然要到运行时才能知道,因此编译时强制转换为 .dynamicType 的结果是没有意义的。

所以答案是:"You can't"(没有充分的理由去尝试)。

首先,as 在右侧取一个类型,而不是表达式。所以你有一个语法错误。

您似乎想做的是 "cast" 一个在运行时计算的类型。这甚至意味着什么?让我们首先考虑什么是 "cast".

通常,当我们有一个强制转换表达式x as T时,它有两个组成部分:

  • 在编译时:整个强制转换表达式 x as T 具有编译时类型 T?,它允许您使用结果表达式执行您可能无法在 [=15= 上执行的操作] 直接地。换句话说,它允许您更改编译时类型。
  • 在运行时:它检查 x 的运行时类型是否是 T 的子类型,如果是,则计算为包含该值的可选值,否则计算为 nil.

如果类型 T 在编译时未知,那么显然您不能执行它的编译时部分。 (结果表达式的编译时类型显然不能依赖于编译时未知的东西。)

另一部分,运行时组件,可以用运行时计算的类型来完成吗?当然。例如,

import Foundation
let afterCast : Super? =
    (superA as AnyObject).isKindOfClass(subType) ? superA : nil

不清楚这是否是您想要的。