在字典数组中搜索 Swift 中的值

Search Array of Dictionaries for Value in Swift

我是 Swift 的新手,正在 class 学习 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<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

如果能就如何推进此事提供任何帮助,我将不胜感激。我已经四处寻找示例,但我很快就找不到适用于我在这里尝试做的事情的示例。

在循环内部,您需要从字典中获取 "favorite drink" 条目,并将其附加到数组中:

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"]!,最后加上感叹号。 不要这样做。这被称为 "force unwrapping" 可选,如果字典中没有有效值 return,您的程序将崩溃。

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

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

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

.map 的意思是:运行 遍历 characters 中的每个条目,并将 运行 宁这个表达式的结果放在一个新数组中(然后你 return).

??的意思是:如果你从左边得到一个nil,用右边的值替换它。

Airspeed Velocity 的回答非常全面,提供了一个有效的解决方案。实现相同结果的更紧凑的方法是使用 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 { [=10=]["favorite drink"] != nil }.map { [=10=]["favorite drink"]! }
}

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

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

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

["prune juice", "tea, Earl Grey, hot"]
let drinks = characters.map({[=10=]["favorite drink"]}) // [Optional("prune juice"), Optional("tea, Earl Grey, hot")]

let drinks = characters.filter({[=11=]["favorite drink"] != nil}).map({[=11=]["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([=10=]) };
      if filteredArray.count != 0
      {
          let value = filteredArray[0] as NSDictionary
          txtVal = value.objectForKey("Name") as String
      }

我有客户数组,每个客户都有名字,phone 号码和其他存根。所以我使用下面的代码在搜索栏的字典数组中按 phone 号码进行搜索

 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;
        }

    }

可能对你有帮助

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([=10=]) };
println("names = ,\(filteredArray)");