我有一个[String:String]
字典。我想获得与包含字符串“S”的任何键相关联的值。订单无关紧要。
这很简单:只需获取所有键,迭代,返回匹配条件的第一个键。
但是,我想用一种快速优雅的方法来做到这一点。使用filter
或map
函数的东西。那就是我迷路的地方......
答案 0 :(得分:11)
由于您只对任何匹配值感兴趣,
您可以使用indexOf()
方法查找第一个匹配项
字典条目。这是因为
字典是键/值对的集合。
Swift 2:
let dict = ["foo": "bar", "PQRS": "baz"]
let searchTerm = "S"
if let index = dict.indexOf({ (key, _) in key.containsString(searchTerm) }) {
let value = dict[index].1
print(value)
} else {
print("no match")
}
一旦找到匹配的键,谓词就会返回true
并且枚举停止。 index
是一个"字典索引"哪一个
可以直接用来获取相应的字典条目。
对于不区分大小写的键搜索,请用
替换谓词{
(key, _) in key.rangeOfString(searchTerm, options: .CaseInsensitiveSearch) != nil
}
在 Swift 3 中,您可以使用first(where:)
查找第一个匹配项
element,这可以保存一个字典查找:
if let entry = dict.first(where: { (key, _) in key.contains(searchTerm) }) {
print(entry.value)
} else {
print("no match")
}
对于不区分大小写的键搜索,请用
替换谓词{
(key, _) in key.range(of: searchTerm, options: .caseInsensitive) != nil
}
答案 1 :(得分:6)
您可以使用flatMap
和containsString
:
Swift 2.x :
let dict = ["one": "1", "two": "2", "three": "3", "four": "4", "five": "5", "six": "6"]
let results = dict.flatMap { (key, value) in key.lowercaseString.containsString("o") ? value : nil }
print(results)
输出:
["4", "1", "2"]
print(results.first ?? "Not found")
4
或者,如果你喜欢神秘的一个衬垫:
let first = dict.flatMap { $0.lowercaseString.containsString("o") ? $1 : nil }.first ?? "Not found"
Swift 3 :
let dict = ["one": "1", "two": "2", "three": "3", "four": "4", "five": "5", "six": "6"]
let results = dict.flatMap { (key, value) in key.lowercased().contains("o") ? value : nil }
print(results)
print(results.first ?? "Not Found")
或者,如果你喜欢神秘的一个衬垫:
let first = dict.flatMap { $0.lowercased().contains("o") ? $1 : nil }.first ?? "Not Found"
答案 2 :(得分:5)
您可以使用filter
,contains
和first
来查找“s”:
Swift 2
if let key = yourDictionary.keys.filter({ $0.lowercaseString.characters.contains("s") }).first, let result = yourDictionary[key] {
print(result)
}
Swift 3
if let key = yourDictionary.keys.filter({ $0.lowercased().contains("s") }).first, let result = yourDictionary[key] {
print(result)
}
在评论中,@Hamish为Swift 3提供了这个出色的替代方案:而不是
filter({ ... }).first
你可以使用
first(where: { ... })
示例:
if let key = yourDictionary.keys.first(where: { $0.lowercased().contains("s") }), let result = yourDictionary[key] {
print(result)
}