代码之家  ›  专栏  ›  技术社区  ›  MH175

泛型函数,用于从allCases获取枚举事例的索引

  •  0
  • MH175  · 技术社区  · 5 年前

    我有一个类,它的属性是枚举中的一个case。我想写一个泛型函数来获取枚举的 allCases .

    HasEnumCase 简单地说,采用者有一个相关的 CaseIterable & Equatable 类型。

    protocol HasEnumCase {
        associatedtype TheEnum: CaseIterable & Equatable
        var theCase: TheEnum { get }
    }
    

    func getIndexInAllCases<T: HasEnumCase>(theInstance: T) -> Int {
        let allCases = T.TheEnum.allCases
        let index = allCases.firstIndex(of: theInstance.theCase)
        return index
    }
    
    //Cannot convert return expression of type 'T.TheEnum.AllCases.Index' to return type 'Int'
    

    它在我使用具体类型时编译。

    enum MyEnum: CaseIterable {
        case zero
        case one
    }
    
    class HasEnumClass {
        typealias E = MyEnum
        var myEnum: MyEnum = .one
    }
    
    let h = HasEnumClass()
    let caseIndex = type(of: h.myEnum).allCases.firstIndex(of: h.myEnum)
    // caseIndex = 1
    
    2 回复  |  直到 5 年前
        1
  •  3
  •   dalton_c    5 年前

    类型 Index 定义于 Collection 不一定是一个 Int ,这就是您看到错误的原因。但是,您可以使用常规约束来要求这样做:

    func getIndexInAllCases<T: HasEnumCase>(theInstance: T) -> Int where T.TheEnum.AllCases.Index == Int {
        // ...
    }
    
        2
  •  0
  •   MH175    5 年前

    Index

    我发现我还可以从 allCases

    func getIndexInAllCases<T: HasEnumCase>(theInstance: T) -> Int {
        let allCases = Array(type(of: theInstance).TheEnum.allCases)
        let index = allCases.firstIndex(of: theInstance.theCase)!
        return index
    }