繁体   English   中英

NSPredicate过滤字典数组(Swift)

[英]NSPredicate to filter an Array of Dictionaries (Swift)

我正在尝试学习NSPredicate的美好世界,但是在实际应用中却失败了。 任何指导表示赞赏。

特别是,我想使用NSPredicate过滤字典数组。 例如,采用以下数组并将其过滤为仅包含“ species” ==“ dog”的那些条目。

 var arrayofDictionary:[[String:String]] = [

      ["name": "Ben", "species": "human"], 
      ["name": "Harp", "species": "dog"], 
      ["name": "Guinness", "species": "dog"]

 ]

现在,我知道如何按照以下方式进行过滤,但是我的理解是这是“懒惰”的方式,并且在进行大型计算时运行速度不会很快:

 let filteredArray = arrayofDictionary.filter { $0["species"] == "dog" }.flatMap { $0 }

因此,我一直在玩NSPredicate,觉得以下内容可能是一个不错的起点,但不确定接下来如何使用它。 另外,也许这仅适用于数组而不适用于字典?

 let speciesPredicate = NSPredicate(format: "species == %@", "dog")

谢谢你的帮助!


我只能在Objective-C来找到这个指导这里 不幸的是,我只是开始学习Swift。

这是一个关于NSPredicate的很好的教程,可以让我全神贯注,但是我无法弄清楚如何针对上述情况完全实现。

请检查一下

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)");

我同意@ luk2302的评论,因为使用Swift Array filter方法通常比使用NSPredicate过滤更好。 如果你担心在大型数据集的性能,你应该在你的内容CoreData并使用NSPredicate作为的一部分NSFetchRequest在你的数据模型正确的索引设置。

话虽如此,通过NSPredicate过滤并不明确支持Swift Array类型,因此您必须转换为NSArray才能使用它。 它看起来像这样:

let filteredArray = (arrayofDictionary as NSArray).filteredArrayUsingPredicate(speciesPredicate)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM