2016-07-31 61 views
7

我有一個[String:String]字典。我想獲得與包含字符串「S」的任何鍵相關聯的值。順序無關緊要。在swift詞典中找到一個包含字符串的鍵

這很簡單:只需獲取所有鍵,迭代,返回第一個匹配條件。

然而,我想用一個像swift一樣優雅的方法來做到這一點。使用filtermap函數的東西。而這也正是我迷路了......

回答

9

既然你只感興趣的任何匹配值, 可以使用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 
} 
+0

如果我不需要區分大小寫,因爲我知道字符串都是大寫字母,我可以使用key.contains()而不是key.range(),或者使用key.range()更快嗎? – Adeline

+0

@Adeline:我不認爲這有什麼不同,但'key.contains()'更簡單,所以我會使用它。 –

+0

所有三個答案都是有效的,但他的答案是最快的。 – Adeline

4

您可以使用filtercontainsfirst找到 「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) 
} 
+1

請注意,在Swift 3中,您也可以使用['first(where:)'](http://swiftdoc.org/v3.0/protocol/Sequence/#func-first_)來執行此操作。 – Hamish

+0

@Hamish這是一個很棒的主意,謝謝。你打算在答案中使用它,還是將它添加到我的(當然歸屬)? – Moritz

+0

@EricD我不介意:)我注意到馬丁也在他的回答中使用了它(怪異的計時!),所以我沒有看到任何一點爲我做出單獨的回答。 – Hamish

4

您可以flatMapcontainsString做到這一點:

斯威夫特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" 
相關問題