I came up with something like this
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"
}
}
You can modify the cases to your liking of course plus you can init with a custom value, too.
Example usage:
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)")
}