反向Swift字典查找

时间:2016-12-29 16:53:13

标签: arrays swift dictionary

我的字典看起来像这样:

let ints: [Int: String] = [
    0: "0",
    1: "1",
    2: "2",
    3: "3",
    4: "4",
    5: "5",
    6: "6",
    7: "7",
    8: "8",
    9: "9",
    10: "A",
    11: "B",
    // etc...
]

我可以使用ints[5]查找整数来获取"5"。如何从字符串中查找整数?我想做ints.keys["5"] - >之类的事情。 5

目前,我刚刚向后写了字典:

let chars: [String: Int] = [
    "0": 0,
    "1": 1,
    "2": 2,
    "3": 3,
    "4": 4,
    "5": 5,
    "6": 6,
    "7": 7,
    "8": 8,
    "9": 9,
    "A": 10,
    "B": 11,
    // etc...
]

我可以chars["5"]获取5,但这是一个麻烦的解决方案,因为我的字典很大,并希望能够在需要时轻松更改它。

澄清

我不想以编程方式构建字典,但只保留一个硬编码。

4 个答案:

答案 0 :(得分:4)

您可以利用Swift字典实现Collection协议的事实,该协议扩展了Sequence协议,并使用first方法返回序列的第一个元素匹配给定的标准:

extension Dictionary where Value: Equatable {
    func key(forValue value: Value) -> Key? {
        return first { $0.1 == value }?.0
    }
}

ints.key(forValue: "5")    // 5
ints.key(forValue: "99")   // nil

以上代码的工作原理Dictionary可以与(Key, Value)对序列同化。唯一需要注意的是,如果多个键匹配到相同的值,我们只能获得其中一个键,而且说哪个键不确定 - 尽管如果你的词典有一对一的映射,你就不要#39; t有这个问题。

答案 1 :(得分:1)

我使用Martin R的链接找到了这个解决方案:

let int = 11
print(chars.filter{$1 == int}.map{$0.0}[0]) // B

答案 2 :(得分:1)

另一种方法是以编程方式构造1:1反向查找:

    var chars = ["a":1,"b":2,"c":3]

    var ints = [Int:String]()
    for pair in chars { ints[pair.value] = pair.key }

ints包含:

    [1:"a", 2:"b", 3:"c"]

如果您多次使用它,可能会很有效率。

答案 3 :(得分:0)

与@dfri一样,您可以使用first方法获取给定值的第一个键:

extension Dictionary where Value: Equatable {

    func key(for value: Value) -> Key? {
        return first(where: { $1 == value })?.key
    }


}