在Swift中search字典值的数组

我是Swift新手,上课学习iOS编程。 我发现自己难以find如何在字典数组中searchstring值并将string值转储到数组中。 这是从我的Xcode操场。

我试图找出如何:1)search字典数组2)将search结果转储到一个数组(我已经创build)

这些是字典。

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] 

这是我正在写的function。

 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 

对于如何向前迈进,我将不胜感激。 我已经find了一些例子,但是我很快就find了一个适用于我在这里要做的事情。

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

 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"]! ,结尾有一个感叹号。 不要这样做 。 这被称为“强制解包”一个可选的,如果从字典中没有返回有效的值,你的程序将崩溃。

第一个例子的行为是,如果没有饮料,则不要将其添加到数组中。 但是,这可能不是你想要的,因为你可能期望字符数组中的条目和饮料数组中的条目之间的1对1对应关系。

如果是这样的话,你可能需要一个空string,你可以这样做:

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

.map意味着:运行每个characters条目,并将运行此expression式的结果放入一个新的数组(然后返回)。

?? 意思是:如果你从左边返回nil ,用右边的值replace它。

空速速度的答案是非常全面的,并提供了一个解决scheme。 实现相同结果的更简洁的方法是使用swift数组的filtermap方法:

 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"]! } } 

filter接受一个返回一个布尔值的闭包,这个布尔值指出了一个元素是否必须被包含 – 在我们的例子中,它检查一个元素是否存在"favorite drink"键。 此方法返回满足该条件的字典数组。

第二步使用map方法将每个字典转换成与"favorite drink ”键相对应的值 – 考虑到字典查找总是返回一个可选的(用于缺less关键字),并且filter已经排除了所有字典不具有该键的价值,应用强制解包操作符是安全的! 返回一个非可选的string。

组合的结果是从我的操场上复制的一串string:

 ["prune juice", "tea, Earl Grey, hot"] 
 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] 
  Use the following code to search from NSArray of dictionaries whose keys are ID and Name. var txtVal:NSString let path = NSBundle.mainBundle().pathForResource(plistName, ofType: "plist") var list = NSArray(contentsOfFile: path!) as [[String:String]] var namePredicate = NSPredicate(format: "ID like %@", String(forId)); let filteredArray = list.filter { namePredicate!.evaluateWithObject($0) }; if filteredArray.count != 0 { let value = filteredArray[0] as NSDictionary txtVal = value.objectForKey("Name") as String } 

它可以帮助你

 var customerNameDict = ["firstName":"karthi","LastName":"alagu","MiddleName":"prabhu"]; var clientNameDict = ["firstName":"Selva","LastName":"kumar","MiddleName":"m"]; var employeeNameDict = ["firstName":"karthi","LastName":"prabhu","MiddleName":"kp"]; var attributeValue = "karthi"; var arrNames:Array = [customerNameDict,clientNameDict,employeeNameDict]; var namePredicate = NSPredicate(format: "firstName like %@",attributeValue); let filteredArray = arrNames.filter { namePredicate.evaluateWithObject($0) }; println("names = ,\(filteredArray)"); 

我有客户arrays,每个客户有姓名,电话号码和其他存根。所以我用下面的代码search栏中的字典数组中search电话号码

  for index in self.customerArray { var string = index.valueForKey("phone") if let phoneNumber = index.valueForKey("phone") as? String { string = phoneNumber } else { string = "" } if string!.localizedCaseInsensitiveContainsString(searchText) { filtered.addObject(index) searchActive = true; } }