【问题标题】:Enum with associated value does not conform to CaseIterable and throws error具有关联值的枚举不符合 CaseIterable 并引发错误
【发布时间】:2020-05-12 17:11:31
【问题描述】:

以下枚举工作正常,没有任何错误。

enum EnumOptions: CaseIterable {
        case none
        case mild
        case moderate
        case severe
        case unmeasurable
}

当我尝试将关联值添加到其中一种情况时,它会引发以下错误“类型'EnumOptions'不符合协议'CaseIterable'。你想添加协议存根吗?”

enum OedemaOptions: CaseIterable {
        case none
        case mild
        case moderate
        case severe
        case unmeasurable(Int)
}

添加存根后,

enum OedemaOptions: CaseIterable {
        typealias AllCases = <#type#>

        case none
        case mild
        case moderate
        case severe
        case unmeasurable(Int)

应该在占位符中填写什么以使 Enum 符合 CaseIterable,因为只有 1 个案例具有关联值,而不是所有案例?

【问题讨论】:

  • 来自documentationThe compiler can automatically provide an implementation of the CaseIterable requirements for any enumeration without associated values。您基本上需要提供自己的CaseIterable 实现

标签: ios swift enums


【解决方案1】:

自动综合不适用于具有关联值的枚举。您需要提供 allCases 属性的自定义实现。试试吧,

enum OedemaOptions: CaseIterable {
    static var allCases: [OedemaOptions] {
        return [.none, .mild, .moderate, .severe, .unmeasurable(-1)]
    }
    
    case none
    case mild
    case moderate
    case severe
    case unmeasurable(Int)
}

【讨论】:

    【解决方案2】:

    您忘记计算所有 18,446,744,073,709,551,616 Ints。

    另外,每个都是Option,而不是Options

    static var allCases: [OedemaOption] {
      [.none, .mild, .moderate, .severe]
      + (.min...(.max)).map(unmeasurable)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多