【发布时间】:2020-10-05 10:35:41
【问题描述】:
我正在寻找一种可以根据枚举案例更改列表的方法,其中列表的源是 CaseIterable 枚举。例如:
enum TypeA: Int, CaseIterable {
case one, two, three
}
enum TypeB: Int, CaseIterable {
case a, b, c
}
我想写这样的东西:
enum PropChoice {
case typeA, typeB
func chosenEnumType<T: CaseIterable>() -> T {
switch self {
case .typeA:
return TypeA.self as! T
case .typeB:
return TypeB.self as! T
}
}
}
然后像这样使用它:
let propType = PropChoice.typeA
let choices = propType.chosenEnumType.allCases() \\\ Compiler error `Generic parameter T could not be inferred`
for choice in choices {
print(choice.rawValue)
}
我收到如上所示的编译器错误。出于兴趣 - 我的用例是一个 SwiftUI 应用程序,用户可以在其中选择过滤器屏幕中的属性,并且我想在 Picker 中显示选项列表。
【问题讨论】:
-
泛型并不是你真正需要的,因为你的返回类型不是泛型的,你只是希望能够返回几种不同的类型。解决方案是返回一个通用类型,在这种情况下是
CaseIterable(或更准确地说,CaseIterable && RawRepresentable,但是由于协议的associatedType要求,它不能用作返回类型。所以您需要类型擦除才能返回符合CaseIterable的类型,但是,类型擦除Caseiterable并不是一项简单的任务(我不确定它是否可能)。