У меня есть класс со свойством, которое является случаем из Enum.Я хочу написать обобщенную функцию, чтобы получить индекс регистра в Enum 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