簡體   English   中英

Swift:枚舉 Int,可針對各種情況進行編碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM