我有一個[String:String]
字典。我想獲得與包含字符串「S」的任何鍵相關聯的值。順序無關緊要。在swift詞典中找到一個包含字符串的鍵
這很簡單:只需獲取所有鍵,迭代,返回第一個匹配條件。
然而,我想用一個像swift一樣優雅的方法來做到這一點。使用filter
或map
函數的東西。而這也正是我迷路了......
我有一個[String:String]
字典。我想獲得與包含字符串「S」的任何鍵相關聯的值。順序無關緊要。在swift詞典中找到一個包含字符串的鍵
這很簡單:只需獲取所有鍵,迭代,返回第一個匹配條件。
然而,我想用一個像swift一樣優雅的方法來做到這一點。使用filter
或map
函數的東西。而這也正是我迷路了......
既然你只感興趣的任何匹配值, 可以使用indexOf()
方法找到第一個匹配的 字典條目。這是可行的,因爲 字典是鍵/值對的集合。
夫特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
}
更換謂語斯威夫特3可以使用first(where:)
找到第一個匹配 元素,這節省了一個詞典查詢:
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
}
您可以使用filter
,contains
和first
找到 「S」:
斯威夫特2
if let key = yourDictionary.keys.filter({ $0.lowercaseString.characters.contains("s") }).first, let result = yourDictionary[key] {
print(result)
}
斯威夫特3
if let key = yourDictionary.keys.filter({ $0.lowercased().contains("s") }).first, let result = yourDictionary[key] {
print(result)
}
在評論中,@Hamish優惠對於斯威夫特3這個優秀的選擇:不是
filter({ ... }).first
可以使用
first(where: { ... })
例子:
if let key = yourDictionary.keys.first(where: { $0.lowercased().contains("s") }), let result = yourDictionary[key] {
print(result)
}
您可以flatMap
和containsString
做到這一點:
斯威夫特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"
對於斯威夫特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"
如果我不需要區分大小寫,因爲我知道字符串都是大寫字母,我可以使用key.contains()而不是key.range(),或者使用key.range()更快嗎? – Adeline
@Adeline:我不認爲這有什麼不同,但'key.contains()'更簡單,所以我會使用它。 –
所有三個答案都是有效的,但他的答案是最快的。 – Adeline