作者:玩玩r28g | 来源:互联网 | 2023-05-24 15:22
我是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"]
这是上面列出的字符词典数组.
let characters = [worf, picard]
这是我正在尝试写的功能.
func favoriteDrinksArrayForCharacters(characters:Array>) -> Array {
// 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
对于如何在这方面取得进展,我将不胜感激.我已经挖掘了一些例子,但我很快找到一个适用于我在这里尝试做的事情.
1> Airspeed Vel..:
在循环内部,您需要从字典中获取"最喜欢的饮料"条目,并将其附加到数组:
for character in characters {
if let drink = character["favorite drink"] {
favoriteDrinkArray.append(drink)
}
}
注意,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"] ?? ""
}
}
该.map
方法:通过在每个条目运行characters
,并把运行在一个新的数组这个表达式(你然后返回)的结果.
的??
手段:如果你得到一个nil
从左侧,与在右边的值替换它.
2> Antonio..:
Airspeed Velocity的答案非常全面,并提供了可行的解决方案。实现相同结果的一种更紧凑的方法是使用swift数组的filter
and map
方法:
func favoriteDrinksArrayForCharacters(characters:Array>) -> Array {
// create an array of Strings to dump in favorite drink strings
return characters.filter { $0["favorite drink"] != nil }.map { $0["favorite drink"]! }
}
过滤器使用闭包返回一个布尔值,该布尔值说明是否必须包含元素-在我们的例子中,它检查key是否存在元素"favorite drink"
。此方法返回满足该条件的字典数组。
第二步使用该map
方法将每个字典转换为与"favorite drink
“键” 对应的值-考虑到字典查找总是返回一个可选值(以解决键丢失),并且过滤器已经排除了所有没有键的字典。该键的值,则可以安全地应用强制展开操作符!
以返回非可选字符串。
合并后的结果是一个字符串数组-从我的游乐场复制来的:
["prune juice", "tea, Earl Grey, hot"]
3> Aleksey G...:
let drinks = characters.map({$0["favorite drink"]}) // [Optional("prune juice"), Optional("tea, Earl Grey, hot")]
要么
let drinks = characters.filter({$0["favorite drink"] != nil}).map({$0["favorite drink"]!}) // [prune juice, tea, Earl Grey, hot]