我正在尝试实现一个需要一个函数的协议,该函数应该返回符合Type
类型的CaseIterable
。当我调用该函数时,我希望能够在返回的泛型类型上调用.allCases
。不幸的是,编译器不会让我。
protocol FooDataSource: class {
func caseIterable<T: CaseIterable>(for foo: Foo) -> T.Type
}
class Foo {
weak var dataSource: FooDataSource?
func callAllCasesProperty() {
let a = self.dataSource?.caseIterable(for: self).allCases
}
}
当我试图在游乐场中运行该代码时,我得到:
错误:experiments.playground:7:58:错误:无法推断通用参数
T
let a = self.dataSource?.caseIterable(for: self).allCases
有没有办法实现预期的功能?
虽然我不确定你要完成什么,但看起来你可以使用一个泛型函数,对类型有一些特定的约束。通过将T限制为RawRepresentable和CaseIterable,您可以将枚举类型作为参数传递,并在函数中调用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)