gpt4 book ai didi

c - 如何快速捕获无效的枚举

转载 作者:行者123 更新时间:2023-11-30 10:51:47 26 4
gpt4 key购买 nike

我使用C来转换我的在线有效载荷,所以将int转换为C中的枚举转换:

typedef CF_ENUM( uint8_t, MyEnum_t ) {
a = 0
b = 1
}
...
value = ( MyEnum_t * ) rawValue;


因为该值是线传的,所以实际的原始值可以是任何uint8_t。 rawValue实际上可能不是0或1。

下面我有一个快速代码示例,其中显示了将枚举设置为不可能/无效的值以及处理该值的switch语句。

import Foundation

enum MyEnum: UInt8 {
case a = 0
case b = 1
}

let raw: UInt8 = 0b100 // 4
let value: MyEnum = unsafeBitCast(raw, to: MyEnum.self)

switch value {
case .a:
print("a:", value) // * not reached *
case .b:
print("b:", value) // "b: \n"
print("value == .a => \(value == .a)") // "x == .a => true\n"
print("value == .b => \(value == .b)") // "x == .b => false\n"
}

print(value.rawValue) // "0"


C原始值为4,快速样本显示了疯狂的结果:


4次强制转换不会为其值打印任何内容(很可能是char 4或0,但都无法打印)
4个开关作为MyEnum.b(1)
4等同于MyEnum.a(0)
MyEnum原始值显示为0时显示4(MyEnum.a)


有什么办法可以迅速捕获此错误?我宁愿不使用这些奇怪的结果来检测异常。

最佳答案

函数的名称unsafeBitCast不言而喻。此外,documentation明确指出:


  警告调用此函数将破坏Swift类型系统的保证;使用时要格外小心。


您绝对不应像这样在Swift中依赖内部枚举实现,因为它可能会更改。您应该以标准方式处理特殊情况。也许,您可以只添加一个自定义初始化程序:

import Foundation

enum MyEnum: UInt8 {
case a = 0
case b = 1

init(fromWire value: UInt8) { // handle unusual input here
self = value == 0 ? .a : .b
}
}

// Test how it works
let arr: [UInt8] = [0, 1, 4]
for raw in arr {
print("Input:", raw)
let value = MyEnum(fromWire: raw)
print("Value: \(value), raw enum value: \(value.rawValue)")
if value==MyEnum.a { print("value == .a") }
if value==MyEnum.b { print("value == .b") }
switch value {
case .a: print("case .a")
case .b: print("case .b")
}
print()
}


输出:

Input: 0
Value: a, raw enum value: 0
value == .a
case .a

Input: 1
Value: b, raw enum value: 1
value == .b
case .b

Input: 4
Value: b, raw enum value: 1
value == .b
case .b

关于c - 如何快速捕获无效的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54385801/

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