swift - 将 ENUM 哈希和原始值复制到字典中

标签 swift dictionary enums associative-array

有什么方法可以将枚举的所有值复制到字典中,而无需在任何 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) { $0.load(as: Self.self) }
                guard current.hashValue == raw else {
                    return nil
                }
                raw += 1
                return current
            }
        })
    }
}
#endif

原创 post CaseIterable 实现。

关于swift - 将 ENUM 哈希和原始值复制到字典中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53571495/

相关文章:

ios - 刷新 token uber swift 返回 nil

Python:如何在不循环的情况下获得给定值的字典键?

Python 多处理 - 当最快的进程终止时返回

c# - 理解枚举——用作常量

json - 使用 JSON 序列化/反序列化 Dart 的新枚举的最佳方法是什么?

swift - 如何在函数中引用变量?

ios - 使用注释坐标删除注释

ios - 从 URL 加载的图像在 UITableView 滚动时发生变化

python - 如何将项目添加到 OrderedDict

linux - 枚举数据类型在 bash 中似乎不可用