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

时间:2018-12-01 13:58:59

标签: 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进行一次调用。

谢谢。

3 个答案:

答案 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

CaseIterable实现的原始https://bitbucket.org/chrisconnors/mndspn/src/4724d5c4a3d67fad9e2e7d84f2ec3916e75360f7/docker-compose.yml?at=master&fileviewer=file-view-default#docker-compose.yml-39

答案 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