我有一个字典,看起来像这样:
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
,但这是一个麻烦的解决方案,因为我的字典很大,并希望能够在需要时轻松更改它。
我不想以编程方式构造字典,而只是保留一个硬编码。
您可以利用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)
对。唯一需要注意的是,如果多个键匹配到相同的值,我们只得到其中一个键,并且说哪个键不确定 - 尽管如果你的词典有1对1映射你就没有这个问题。
我用Martin R的链接找到了这个解决方案:
let int = 11
print(chars.filter{$1 == int}.map{$0.0}[0]) // B
像@dfri提到的那样,您可以使用first
方法获取给定值的第一个键:
extension Dictionary where Value: Equatable {
func key(for value: Value) -> Key? {
return first(where: { $1 == value })?.key
}
}