NSPredicate过滤字典数组(Swift)

时间:2016-05-25 20:18:04

标签: ios arrays swift dictionary nspredicate

我正在努力学习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 here中找到相关指导。不幸的是我只是开始接受Swift。

这是a good tutorial on NSPredicate开始让我的头缠绕它,但我无法弄清楚如何完全实现上述情况。

2 个答案:

答案 0 :(得分:5)

请查看

{{1}}

答案 1 :(得分:1)

我同意@ luk2302的评论,因为使用Swift Array filter方法比使用NSPredicate过滤更好。如果您担心大型数据集的效果,则应将您的内容放在CoreData中,并使用NSPredicate作为NSFetchRequest的一部分,并在数据模型中使用正确的索引设置。< / p>

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

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