Я использую C для приведения своих полезных нагрузок по проводам, поэтому преобразование int в enum в 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, приведенное к силе, ничего не печатает для своего значения (скорее всего, символы 4 или 0, оба непечатаемые)
- 4 переключается, поскольку MyEnum.b (1)
- 4 сравнивается в равной степени с MyEnum.a (0)
- 4, поскольку необработанное значение MyEnum выводит 0 (MyEnum.a)
Есть ли способ зафиксировать эту ошибку в swift?Я предпочитаю не использовать эти странные результаты для выявления аномалии.