在Swift中转换为元类型?

the*_*iat 10 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'"
Run Code Online (Sandbox Code Playgroud)

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

编辑:

正如newacct指出的那样,直到运行时才明白.dynamicType的结果,因此编译时转换为.dynamicType的结果是没有意义的.

所以答案是:"你不能"(并且没有充分的理由去尝试).

new*_*cct 4

首先,as右侧采用类型,而不是表达式。所以你遇到的是语法错误。

您似乎想要做的是将“转换”为在运行时计算的类型。这意味着什么?我们首先来考虑一下什么是“演员表”。

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

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

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

另一部分,即运行时组件,是否可以通过运行时计算的类型来完成?当然。例如,

import Foundation
let afterCast : Super? =
    (superA as AnyObject).isKindOfClass(subType) ? superA : nil
Run Code Online (Sandbox Code Playgroud)

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