有什么方法可以将枚举的所有值复制到字典中,而无需在任何 FOR 循环中对其进行轮询?
例如,从此枚举:
enum FruitPriority: String {
case PEARS
case ORANGES
case APPLES
}
从ENUM内部调用某些单个函数,如下所示:
var fruitPriorityArray: [String : Int] = FruitPriority.someFunction()
并获得此结果(根据哈希值排序):
["PEARS": 0, "ORANGES": 1, "APPLES": 2]
首选项将是 仅对ENUM进行一次调用。
谢谢。
答案 0 :(得分:2)
enum FruitPriority: String, CaseIterable {
case PEARS
case ORANGES
case APPLES
}
let result = FruitPriority.allCases.enumerated().reduce([String: Int]()) { dict, fruit in
var dict = dict
dict[fruit.element.rawValue] = fruit.offset
return dict
}
print(result)
结果是:
[“梨”:0,“橙色”:1,“苹果”:2]
对于版本4.1和更早版本的CaseIterable
的实现:
#if swift(>=4.2)
#else
public protocol CaseIterable {
associatedtype AllCases: Collection where AllCases.Element == Self
static var allCases: AllCases { get }
}
extension CaseIterable where Self: Hashable {
static var allCases: [Self] {
return [Self](AnySequence { () -> AnyIterator<Self> in
var raw = 0
return AnyIterator {
let current = withUnsafeBytes(of: &raw) { $0.load(as: Self.self) }
guard current.hashValue == raw else {
return nil
}
raw += 1
return current
}
})
}
}
#endif
答案 1 :(得分:1)
如果您只需要单次调用枚举:
在您的枚举中添加CaseIterable
,然后在枚举中创建函数getDictionary
,该函数将返回您的字典(对于每个枚举,rawValue
将被分配为key
和{{ 1}}为hashValue
)
value
那你就可以打电话
enum FruitPriority: String, CaseIterable {
case PEARS
case ORANGES
case APPLES
func getDictionary() -> [String: Int] {
var dictionary = [String: Int]()
FruitPriority.allCases.forEach {
dictionary[$0.rawValue] = $0.hashValue
}
return dictionary
}
}
注意:如果您使用的是较早版本的Swift,则可以看到this创建var fruitPriorityArray: [String : Int] = FruitPriority.getDictionary()
协议
答案 2 :(得分:1)
如果将枚举设为reduce(into:)
,则可以使用hashValue
来构造字典。由于enumerated()
现在可以在每次运行之间更改,因此我建议使用enum FruitPriority: String, CaseIterable {
case PEARS
case ORANGES
case APPLES
}
let result = FruitPriority.allCases.enumerated().reduce(into: [:]) { $0[$1.element.rawValue] = $1.offset }
print(result)
// ["ORANGES": 1, "APPLES": 2, "PEARS": 0]
来按顺序对情况进行编号:
go test fts -run run_test.go