【发布时间】:2020-05-24 00:40:55
【问题描述】:
让我们考虑一个简化的情况,有两个符合CaseIterable 的枚举类型。
enum A: String, CaseIterable {
case a1, a2, a3
}
enum B: String, CaseIterable {
case b1, b2, b3
}
我想做的是创建某种哈希表,将键(在我的示例中为字符串)和枚举的 type 关联起来:
let dict: [String : CaseIterable.Type] = [ // Error here: Protocol 'CaseIterable' can only be used as a generic constraint because it has Self or associated type requirements
"my key A" : A.self,
"my key B" : B.self
]
我最终需要实现的是“查询”我的哈希表以获取特定键并对结果应用协议方法(例如allCases)。
let cases = dict["my key A"]!.allCases
有什么建议吗?
【问题讨论】:
-
这里编译器抱怨的关联类型是枚举本身,所以在你的情况下是 A 和 B。
-
您希望
cases是什么(静态,在编译时已知)类型?这是“一些未知枚举的情况”,那么你会如何处理这个变量呢?您对这些案例是什么或您可以调用哪些方法一无所知。如果您显示您将如何处理cases的代码,那么这将显示您打算使用的实际协议(而不是 CaseIterable) -
为您的案例分配相同的字符串值是没有意义的
-
@Rob Napier:所有枚举在编译时都是已知的。每个枚举都描述了不同的情况,因此每个枚举都有不同的情况。我需要使用的实际协议是“CaseIterable”——我想显示一个列出所有可能选项的菜单。
-
@Leo Dabus:不是没有意义,只是一个例子,字符串值与问题无关。