将 ENUM 哈希和原始值复制到字典中
Copying ENUM hash and raw values into a dictionary
有没有办法将枚举的所有值复制到字典中,而无需在任何 FOR 循环中轮询它们?
例如,从这个枚举:
enum FruitPriority: String {
case PEARS
case ORANGES
case APPLES
}
从 ENUM 中调用某个函数,如下所示:
var fruitPriorityArray: [String : Int] = FruitPriority.someFunction()
得到这个结果(根据哈希值排序):
["PEARS": 0, "ORANGES": 1, "APPLES": 2]
首选 只调用一次 ENUM。
谢谢。
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)
结果是:
["PEARS": 0, "ORANGES": 1, "APPLES": 2]
对于版本 Swift 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) { [=11=].load(as: Self.self) }
guard current.hashValue == raw else {
return nil
}
raw += 1
return current
}
})
}
}
#endif
CaseIterable
实现的原始 post。
如果您只需要调用枚举:
将 CaseIterable
添加到您的枚举中,然后在 returns 您的字典中的枚举中创建函数 getDictionary
(对于每个枚举案例,将 rawValue
分配为 key
和 hashValue
作为 value
)
enum FruitPriority: String, CaseIterable {
case PEARS
case ORANGES
case APPLES
func getDictionary() -> [String: Int] {
var dictionary = [String: Int]()
FruitPriority.allCases.forEach {
dictionary[[=10=].rawValue] = [=10=].hashValue
}
return dictionary
}
}
那你就可以打电话
var fruitPriorityArray: [String : Int] = FruitPriority.getDictionary()
注意: 如果您使用的是 Swift 的早期版本,您可以看到 this 创建 CaseIterable
协议
如果您将枚举设为 CaseIterable
,则可以使用 reduce(into:)
构建字典。由于 hashValue
现在可以从 运行 运行 更改,我建议使用 enumerated()
按顺序对案例进行编号:
enum FruitPriority: String, CaseIterable {
case PEARS
case ORANGES
case APPLES
}
let result = FruitPriority.allCases.enumerated().reduce(into: [:]) { [=10=][.element.rawValue] = .offset }
print(result)
// ["ORANGES": 1, "APPLES": 2, "PEARS": 0]
有没有办法将枚举的所有值复制到字典中,而无需在任何 FOR 循环中轮询它们?
例如,从这个枚举:
enum FruitPriority: String {
case PEARS
case ORANGES
case APPLES
}
从 ENUM 中调用某个函数,如下所示:
var fruitPriorityArray: [String : Int] = FruitPriority.someFunction()
得到这个结果(根据哈希值排序):
["PEARS": 0, "ORANGES": 1, "APPLES": 2]
首选 只调用一次 ENUM。
谢谢。
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)
结果是:
["PEARS": 0, "ORANGES": 1, "APPLES": 2]
对于版本 Swift 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) { [=11=].load(as: Self.self) }
guard current.hashValue == raw else {
return nil
}
raw += 1
return current
}
})
}
}
#endif
CaseIterable
实现的原始 post。
如果您只需要调用枚举:
将 CaseIterable
添加到您的枚举中,然后在 returns 您的字典中的枚举中创建函数 getDictionary
(对于每个枚举案例,将 rawValue
分配为 key
和 hashValue
作为 value
)
enum FruitPriority: String, CaseIterable {
case PEARS
case ORANGES
case APPLES
func getDictionary() -> [String: Int] {
var dictionary = [String: Int]()
FruitPriority.allCases.forEach {
dictionary[[=10=].rawValue] = [=10=].hashValue
}
return dictionary
}
}
那你就可以打电话
var fruitPriorityArray: [String : Int] = FruitPriority.getDictionary()
注意: 如果您使用的是 Swift 的早期版本,您可以看到 this 创建 CaseIterable
协议
如果您将枚举设为 CaseIterable
,则可以使用 reduce(into:)
构建字典。由于 hashValue
现在可以从 运行 运行 更改,我建议使用 enumerated()
按顺序对案例进行编号:
enum FruitPriority: String, CaseIterable {
case PEARS
case ORANGES
case APPLES
}
let result = FruitPriority.allCases.enumerated().reduce(into: [:]) { [=10=][.element.rawValue] = .offset }
print(result)
// ["ORANGES": 1, "APPLES": 2, "PEARS": 0]