在Swift中搜索字典数组的值

Adr*_*ian 11 arrays xcode dictionary ios swift

我是Swift的新手,上课学习iOS编程.我发现自己难以理解如何在字典数组中搜索字符串值并将字符串值转储到数组中.这是从我的Xcode游乐场获取的.

我试图弄清楚如何:1)搜索字典数组2)将搜索结果转储到数组(我已经创建)

这些是字符词典.

let worf = [
    "name": "Worf",
    "rank": "lieutenant",
    "information": "son of Mogh, slayer of Gowron",
    "favorite drink": "prune juice",
    "quote" : "Today is a good day to die."]

let picard = [
    "name": "Jean-Luc Picard",
    "rank": "captain",
    "information": "Captain of the USS Enterprise",
    "favorite drink": "tea, Earl Grey, hot"]
Run Code Online (Sandbox Code Playgroud)

这是上面列出的字符词典数组.

let characters = [worf, picard]
Run Code Online (Sandbox Code Playgroud)

这是我正在尝试写的功能.

func favoriteDrinksArrayForCharacters(characters:Array<Dictionary<String, String>>) -> Array<String> {
    // create an array of Strings to dump in favorite drink strings
    var favoriteDrinkArray = [String]()

    for character in characters {
        // look up favorite drink

        // add favorite drink to favoriteDrinkArray
    }

    return favoriteDrinkArray
}

let favoriteDrinks = favoriteDrinksArrayForCharacters(characters)

favoriteDrinks
Run Code Online (Sandbox Code Playgroud)

对于如何在这方面取得进展,我将不胜感激.我已经挖掘了一些例子,但我很快找到一个适用于我在这里尝试做的事情.

Air*_*ity 14

在循环内部,您需要从字典中获取"最喜欢的饮料"条目,并将其附加到数组:

for character in characters {
    if let drink = character["favorite drink"] {
        favoriteDrinkArray.append(drink)
    }
}
Run Code Online (Sandbox Code Playgroud)

注意,if let drink =防范数组中没有这样的条目的可能性 - 如果没有,你得到一个nil回来,并且if正在检查它,只是添加条目,如果它不是零.

您有时可能会看到人们跳过该if let部分,而只是写let drink = character["favorite drink"]!,最后带有感叹号. 不要这样做.这被称为"强制解包"一个可选项,如果没有从字典返回的有效值,则程序将崩溃.

第一个示例的行为是,如果没有饮料,则不将其添加到数组中.但这可能不是您想要的,因为您可能期望字符数组中的条目与drink数组中的条目之间存在一对一的对应关系.

如果是这种情况,并且您可能想要一个空字符串,那么您可以这样做:

func favoriteDrinksArrayForCharacters(characters: [[String:String]]) -> [String] {
    return characters.map { character in
        character["favorite drink"] ?? ""
    }
}
Run Code Online (Sandbox Code Playgroud)

.map方法:通过在每个条目运行characters,并把运行在一个新的数组这个表达式(你然后返回)的结果.

??手段:如果你得到一个nil从左侧,与在右边的值替换它.


Ant*_*nio 6

Airspeed Velocity的答案非常全面,并提供了可行的解决方案。实现相同结果的一种更紧凑的方法是使用swift数组的filterand map方法:

func favoriteDrinksArrayForCharacters(characters:Array<Dictionary<String, String>>) -> Array<String> {
    // create an array of Strings to dump in favorite drink strings
    return characters.filter { $0["favorite drink"] != nil }.map { $0["favorite drink"]! }
}
Run Code Online (Sandbox Code Playgroud)

过滤器使用闭包返回一个布尔值,该布尔值说明是否必须包含元素-在我们的例子中,它检查key是否存在元素"favorite drink"。此方法返回满足该条件的字典数组。

第二步使用该map方法将每个字典转换为与"favorite drink“键” 对应的值-考虑到字典查找总是返回一个可选值(以解决键丢失),并且过滤器已经排除了所有没有键的字典。该键的值,则可以安全地应用强制展开操作符!以返回非可选字符串。

合并后的结果是一个字符串数组-从我的游乐场复制来的:

["prune juice", "tea, Earl Grey, hot"]
Run Code Online (Sandbox Code Playgroud)


Ale*_* G. 6

let drinks = characters.map({$0["favorite drink"]}) // [Optional("prune juice"), Optional("tea, Earl Grey, hot")]
Run Code Online (Sandbox Code Playgroud)

要么

let drinks = characters.filter({$0["favorite drink"] != nil}).map({$0["favorite drink"]!}) // [prune juice, tea, Earl Grey, hot]
Run Code Online (Sandbox Code Playgroud)