【问题标题】:Swift: Enum Int, Codable for a range of casesSwift:枚举 Int,可编码用于各种情况
【发布时间】:2020-06-29 23:16:10
【问题描述】:

我正在尝试为数字范围实现枚举。例如:

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

你们中的任何人都知道如何为一系列数字实现枚举吗?

或者如何解决这个错误。

非常感谢您的帮助。

【问题讨论】:

  • 枚举由单个 Int 支持。我怀疑你正在寻找的只是一个普通的旧init(from int: Int)
  • 用例是什么?您要存储值 (4...100) 吗?或者,如果初始化值 >= 4,您是否只想将枚举初始化为 other
  • @pawello2222 你能发个例子吗?
  • @user2924482 我只是想了解您要实现的目标。如果您提供一些示例说明您打算如何使用枚举(以及为什么范围很重要),它会更容易为您提供帮助。

标签: ios swift iphone enums xcode11.4


【解决方案1】:

我想出了这样的东西

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)")
}

【讨论】:

  • 这不符合 Codable
  • @user2924482 你的意思是像我的回答吗?
猜你喜欢
  • 2018-09-16
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多