在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数组的filter
和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"]! } }
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; } }