【问题标题】:How to handle generic enums (Binary operator '<' cannot be applied)如何处理泛型枚举(不能应用二元运算符'<')
【发布时间】:2021-02-25 05:44:03
【问题描述】:

我想实现一个通用结构来处理许多属性。这些属性(质量、缺陷......)中的每一个都是枚举数组,都符合 Options 协议。 当我声明 OptionType 符合 Options 协议并因此符合 RawRepresentable 时,我很难理解错误,更一般地说,我很难理解如何管理通用枚举类型。 欢迎任何指导!

非常感谢, 乔

struct Property<OptionType: Options> {
    
    var options: [OptionType]
    var label: String {
        "\(OptionType.Type.self)"
    }
    var allSortedOptions: [OptionType] {
        let allOptions = OptionType.allCases as! [OptionType]
        return allOptions.sorted(by: {$0.rawValue < $1.rawValue})
        //Won't compile: Binary operator '<' cannot be applied to two 'OptionType.RawValue' operands
    }
}

protocol Options: CaseIterable, RawRepresentable {}
extension Options {}

enum OptionQualities: String, Options {
    case polite, handsome, smart, funny, enjoyable, articulated
}
enum OptionFlaws: String, Options {
    case lazy, chatty, oftenLate, dirty, agressive, complaining
}

【问题讨论】:

  • 排序后的预期顺序是什么?字典顺序?
  • 我认为是按字母顺序排列的。这是我不使用泛型时得到的。

标签: swift generics enums


【解决方案1】:

您只需将约束添加到您的协议 Options RawRepresentable RawValue 到 String:

protocol Options: CaseIterable, RawRepresentable where RawValue == String { }

或者如果您可能有其他枚举类型,您可以按照 Martin R 的建议简单地将 RawValue 限制为 Comparable 协议

protocol Options: CaseIterable, RawRepresentable where RawValue: Comparable { }

请注意,无需强制转换 allCases as! [OptionType]

var allSortedOptions: [OptionType] {
    OptionType.allCases.sorted(by: { $0.rawValue < $1.rawValue })
}

【讨论】:

  • where RawValue: Comparable
  • 是的!这就是我所缺少的!谢谢狮子座
  • @Joshua 您还应该考虑将其声明为常量而不是计算属性let allSortedOptions = OptionType.allCases.sorted { $0.rawValue &lt; $1.rawValue }
  • 我不确定我是否理解 let 和 computed 属性之间的选择:它是用于内存管理吗?
  • 这样可以避免每次调用此属性时对元素进行排序
猜你喜欢
  • 2016-03-13
  • 1970-01-01
  • 2019-02-15
  • 2017-12-28
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 1970-01-01
相关资源
最近更新 更多