使用NSPredicate筛选基于NSDictionary键的NSArray

我有一个字典arrays。

我想根据一个键过滤数组。

我试过这个:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SPORT == %@)", @"Football"]; NSArray *filteredArray = [data filteredArrayUsingPredicate:predicate]; 

这不行,我没有结果。 我觉得我做错了什么。 我知道这是“体育”是伊娃的方法。 如果它是一个关键,我认为它可能是不同的。

但是我还没有find一个例子。

谢谢


更新

我在我正在search的string周围添加引号。

 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(SPORT == '%@')", @"Football"]; 

它仍然不起作用。


更新2

解决了它。 我实际上已经删除了单引号,这似乎违背了指南的说法。

我真正的问题是我有一个嵌套的数组,我实际上没有评估字典。 骨头移动。

它应该工作 – 只要数据variables实际上是一个数组包含与关键SPORT字典

 NSArray *data = [NSArray arrayWithObject:[NSMutableDictionary dictionaryWithObject:@"foo" forKey:@"BAR"]]; NSArray *filtered = [data filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(BAR == %@)", @"foo"]]; 

在这种情况下过滤包含字典。

(%@不必被引用,这是在NSPredicate创build对象时完成的。)

我知道这是旧消息,但要加两分钱。 默认情况下,我使用LIKE[cd]命令而不是[c][d]将字母与重音符号进行比较。 这在我的魔兽应用中效果特别好,人们拼出他们的名字“Vòódòó”,几乎不可能在桌面视图中search他们的名字。 谓词中的[d]除了重音符号。 因此,谓词@"name LIKE[CD] %@", object.name其中object.name == @"voodoo"将返回包含名称Vòódòó的对象。

从Apple文档:像[cd]意味着“不区分大小写和不区分大小写”。)有关string语法的完整说明以及所有可用操作符的列表,请参阅谓词格式string语法

 #import <Foundation/Foundation.h> // clang -framework Foundation Siegfried.m int main() { NSArray *arr = @[ @{@"1" : @"Fafner"}, @{@"1" : @"Fasolt"} ]; NSPredicate *p = [NSPredicate predicateWithFormat: @"SELF['1'] CONTAINS 'e'"]; NSArray *res = [arr filteredArrayUsingPredicate:p]; NSLog(@"Siegfried %@", res); return 0; } 

NSPredicate仅在iPhone 3.0中可用。

你将不会注意到,直到尝试在设备上运行。

在Swift 3中,当你想用一个基于字典键和值的谓词来过滤一个字典数组时,你可以select下列模式之一。


#1。 使用NSPredicate init(format:arguments:)初始值设定项

如果你来自Objective-C, init(format:arguments:)提供了一个键值编码风格来评估你的谓词。

用法:

 import Foundation let array = [["key1": "value1", "key2": "value2"], ["key1": "value3"], ["key3": "value4"]] let predicate = NSPredicate(format: "key1 == %@", "value1") //let predicate = NSPredicate(format: "self['key1'] == %@", "value1") // also works let filteredArray = array.filter(predicate.evaluate) print(filteredArray) // prints: [["key2": "value2", "key1": "value1"]] 

#2。 使用NSPredicate init(block:)初始化器

如果您更喜欢通过stringtypes的 API 强types 化的 API,则可以使用init(block:)初始化程序。

用法:

 import Foundation let array = [["key1": "value1", "key2": "value2"], ["key1": "value3"], ["key3": "value4"]] let dictPredicate = NSPredicate(block: { (obj, _) in guard let dict = obj as? [String: String], let value = dict["key1"] else { return false } return value == "value1" }) let filteredArray = array.filter(dictPredicate.evaluate) print(filteredArray) // prints: [["key2": "value2", "key1": "value1"]] 

看NSPredicate参考 ,看起来你需要用引号括住你的替代字符。 例如,你当前的谓词为: (SPORT == Football)你想要它读(SPORT == 'Football') ,所以你的格式string需要是@"(SPORT == '%@')"