Хотя я не совсем уверен, чего вы пытаетесь достичь, похоже, вы могли бы использовать универсальную функцию с некоторыми конкретными ограничениями на тип.Ограничив T значением RawRepresentable & CaseIterable, вы можете передать в качестве аргумента тип enum и вызвать allCases в функции.
enum Direction: String, CaseIterable {
case north
case south
case east
case west
}
enum Weight: Int, CaseIterable {
case Light = 1
case Mid = 4
case Heavy = 10
}
func genericMethod<T : RawRepresentable & CaseIterable>(enum enumType: T.Type) {
for aCase in enumType.allCases {
print(aCase.rawValue)
}
}
genericMethod(enum: Direction.self) // prints -> north, south, east, west
genericMethod(enum: Weight.self) // prints -> 1, 4, 10
Вы также можете дополнительно ограничить тип T следующим образом:
func genericMethodWithRawConstraint<T : RawRepresentable & CaseIterable>(enum enumType: T.Type) where T.RawValue == String {
for aCase in enumType.allCases {
print(aCase.rawValue)
}
}
//Will not compile because Weight is of type Int
//genericMethodWithRawConstraint(enum: Weight.self)