[英]Swift: Enum Int, Codable for a range of cases
我正在嘗試為數字范圍實現枚舉。 例如:
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)")
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.