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

k头

您可以在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的结果是没有意义的。

因此答案是:“您不能”(也没有充分的理由尝试)。

newacct

首先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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章