我正在尝试为CaseIterable
的枚举编写一个扩展名,以便我可以获取原始值的数组而不是大小写,虽然我不确定如何做到这一点
extension CaseIterable {
static var allValues: [String] {
get {
return allCases.map({ option -> String in
return option.rawValue
})
}
}
}
我需要以某种方式添加where子句,如果我没有where子句,我会收到一条错误消息,说'map' produces '[T]', not the expected contextual result type '[String]'
有人知道这样做是否有好方法吗?
我的枚举我想让这个功能看起来像这样
enum TypeOptions: String, CaseIterable {
case All = "all"
case Article = "article"
case Show = "show"
}
答案 0 :(得分:7)
并非所有枚举类型都具有关联的RawValue
,如果有,则不一定是String
。
因此,您需要将扩展名限制为RawRepresentable
的枚举类型,并将返回值定义为RawValue
的数组:
extension CaseIterable where Self: RawRepresentable {
static var allValues: [RawValue] {
return allCases.map { $0.rawValue }
}
}
示例:
enum TypeOptions: String, CaseIterable {
case all
case article
case show
case unknown = "?"
}
print(TypeOptions.allValues) // ["all", "article", "show", "?" ]
enum IntOptions: Int, CaseIterable {
case a = 1
case b = 4
}
print(IntOptions.allValues) // [1, 4]
enum Foo: CaseIterable {
case a
case b
}
// This does not compile:
print(Foo.allValues) // error: Type 'Foo' does not conform to protocol 'RawRepresentable'