我正在尝试为数字范围实现枚举。例如:
enum DoSomething: Int, Codable {
case one = 1
case two = 2
case three = 3
case other = 4..100
}
但在这种情况下,我收到此错误:
Raw value for enum case must be a literal
你们中的任何人都知道如何为一系列数字实现枚举吗?
或者如何解决这个错误。
我会非常感谢你的帮助。
我想出了这样的东西
enum rangeEnum: Codable {
case oneToTen
case elevenToTwenty
case custom(ClosedRange<Int>)
init(rawValue: ClosedRange<Int>) {
if rawValue == 1...10 {
self = .oneToTen
} else if rawValue == 11...20 {
self = .elevenToTwenty
} else {
self = .custom(rawValue)
}
}
var rawValue: ClosedRange<Int> {
switch self {
case .oneToTen:
return 1...10
case .elevenToTwenty:
return 11...20
case .custom(let customRange):
return customRange
}
}
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
let firstIndex = try values.decode(Int.self, forKey: .firstIndex)
let lastIndex = try values.decode(Int.self, forKey: .lastIndex)
self = rangeEnum(rawValue: firstIndex...lastIndex)
}
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(self.rawValue.first!, forKey: .firstIndex)
try container.encode(self.rawValue.last!, forKey: .lastIndex)
}
enum CodingKeys: String, CodingKey {
case firstIndex = "firstIndex"
case lastIndex = "lastIndex"
}
}
当然,您可以根据自己的喜好修改案例,也可以使用自定义值进行初始化。
示例用法:
for i in rangeEnum.oneToTen.rawValue {
print("Value of i: \(i)")
}
for i in rangeEnum.elevenToTwenty.rawValue {
print("Value of i: \(i)")
}
for i in rangeEnum.custom(25...45).rawValue {
print("Value of i: \(i)")
}