我有一个简单的枚举:

enum Value {
    case boolean(Bool)
    case number(Double)
    case string(String)
}

我正在编写一个玩具语言翻译器,性能对我来说很重要.给出这个人为制作的代码片段:

let d: Value = .number(1.2)
let stack: [Value] = [d]

我知道stack[0]definitely a .number Value,我想要得到它的关联值(即Double).无论是if let还是guard case,我都想不出一种不需要条件判断的方法来做到这一点.

我想做的是这样的(这是无效的):

let result: Double = (stack[0] as! Value.number)

我知道这很管用:

guard case .number(let result) = stack[0] else {
 // Never happens because I **know** stack[0] is a .number
}
// Now I can use result.

当我知道当前值的类型时,我正在try 避免条件判断,因为这是在热循环中发生的.

推荐答案

可能是这样的:

protocol Value {
}

extension Bool: Value {}
extension Double: Value {}
extension String: Value {}

let d: Double = 1.2
let stack: [Value] = [d]

let result = (stack[0] as! Double)

Swift相关问答推荐

使用简单变量和函数的奇怪行为

OBJC代码中Swift 演员的伊瓦尔:原子还是非原子?

SwiftUI - NavigationLink(value:)和navigationDestination不工作

格式化单位和度量值.为什么从符号初始化的单位不能产生与静态初始化相同的结果

从SwiftUI使用UIPageView时,同一页面连续显示两次的问题

如何偏移HStack中的视图,但仍然约束框架以与偏移匹配?

在扩展中创建通用排序函数

CardStack 和 Lottie

ScreenCaptureKit/CVPixelBuffer 格式产生意外结果

如何使用带有 span 样式标签的 Swift XMLParser

XCUITest 在 TearDown 期间随机失败-无法终止 com.bundle.id

使用列表的下一项更新相同的视图

SwiftUI:从存储在 observableObject 中的数组中删除对象时查看崩溃

在 Swift 中将两个字节的 UInt8 数组转换为 UInt16

Swift:在子类中覆盖 == 导致仅在超类中调用 ==

快速在 LLDB 中使用 po

如何使用 swift 在 tableview 中填充两个不同数组的两个部分?

TabView 在切换选项卡时重置导航堆栈

强制打开已在同一行代码中 Select 性访问的变量是否安全?

转换为 swift 3 后,视图控制器中出现奇怪的通用函数