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"]
]
现在我知道如何按以下方式过滤,但我的理解是这是 "lazy" 的方式,在进行大型计算时不会 运行 快:
let filteredArray = arrayofDictionary.filter { [=12=]["species"] == "dog" }.flatMap { [=12=] }
所以我一直在玩 NSPredicate,感觉下面的内容可能是一个很好的起点,但我不确定接下来如何使用它。另外,也许这只适用于数组而不适用于字典?
let speciesPredicate = NSPredicate(format: "species == %@", "dog")
感谢您的帮助!
我只能在 Objective-C here 中找到这方面的指导。不幸的是,我才开始接受 Swift.
这 a good tutorial on NSPredicate 开始让我头疼,但我想不出如何完全实施上述案例。
我同意 @luk2302 的评论,因为使用 Swift Array
filter
方法通常比使用 NSPredicate
过滤更好。如果您担心大型数据集的性能,您应该将内容放在 CoreData
中,并使用 NSPredicate
作为 NSFetchRequest
的一部分,并在数据模型中设置适当的索引。
话虽如此,NSPredicate
过滤并未明确支持 Swift Array
类型,因此您必须强制转换为 NSArray
才能使用它。它看起来像这样:
let filteredArray = (arrayofDictionary as NSArray).filteredArrayUsingPredicate(speciesPredicate)
请检查一下
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)");
我正在尝试学习 NSPredicate 的精彩世界,但在实际应用中失败了。任何指导表示赞赏。
特别是,我想使用 NSPredicate 来过滤字典数组。例如,采用以下数组并将其过滤为仅包含 "species" == "dog".
的那些条目 var arrayofDictionary:[[String:String]] = [
["name": "Ben", "species": "human"],
["name": "Harp", "species": "dog"],
["name": "Guinness", "species": "dog"]
]
现在我知道如何按以下方式过滤,但我的理解是这是 "lazy" 的方式,在进行大型计算时不会 运行 快:
let filteredArray = arrayofDictionary.filter { [=12=]["species"] == "dog" }.flatMap { [=12=] }
所以我一直在玩 NSPredicate,感觉下面的内容可能是一个很好的起点,但我不确定接下来如何使用它。另外,也许这只适用于数组而不适用于字典?
let speciesPredicate = NSPredicate(format: "species == %@", "dog")
感谢您的帮助!
我只能在 Objective-C here 中找到这方面的指导。不幸的是,我才开始接受 Swift.
这 a good tutorial on NSPredicate 开始让我头疼,但我想不出如何完全实施上述案例。
我同意 @luk2302 的评论,因为使用 Swift Array
filter
方法通常比使用 NSPredicate
过滤更好。如果您担心大型数据集的性能,您应该将内容放在 CoreData
中,并使用 NSPredicate
作为 NSFetchRequest
的一部分,并在数据模型中设置适当的索引。
话虽如此,NSPredicate
过滤并未明确支持 Swift Array
类型,因此您必须强制转换为 NSArray
才能使用它。它看起来像这样:
let filteredArray = (arrayofDictionary as NSArray).filteredArrayUsingPredicate(speciesPredicate)
请检查一下
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)");