在Swift中转换为元类型?

时间:2015-01-10 22:56:35

标签: 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的结果是没有意义的。

所以答案是:"你不能"#34; (并没有充分的理由尝试)。

1 个答案:

答案 0 :(得分:4)

首先,as在右侧采用类型而非表达式。所以你所拥有的是语法错误。

您似乎要尝试做的是“强制转换”为在运行时计算的类型。这甚至意味着什么?让我们首先考虑什么是“演员”。

通常,当我们有一个演员表达式x as T时,它有两个组成部分:

  • 在编译时:整个演员表达式x as T具有编译时类型T?,它允许您使用x直接无法执行的结果表达式执行操作。换句话说,它允许您更改编译时类型。
  • 在运行时:它检查x的运行时类型是否为T的子类型,如果是,则计算为包含该值的可选项,否则,它将计算为{{1 }}。

如果在编译时不知道类型nil,那么显然你不能做它的编译时部分。 (结果表达式的编译时类型显然不能依赖于编译时未知的内容。)

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

T

目前尚不清楚这是否是你想要的。