gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 05:37:22 24 4
gpt4 key购买 nike

你能转换成 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 的结果是没有意义的。

所以答案是:“你不能”(而且没有充分的理由去尝试)。

最佳答案

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

您似乎想做的是“转换”为在运行时计算的类型。这甚至意味着什么?我们先来看看什么是“cast”。

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

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

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

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

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

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

关于swift - 在 Swift 中转换为元类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27882049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com