你能在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的结果是没有意义的.
所以答案是:"你不能"(并且没有充分的理由去尝试).
首先,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)
目前尚不清楚这是否是您想要的。
| 归档时间: |
|
| 查看次数: |
2265 次 |
| 最近记录: |