使用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 == '%@')"
。
- UIImagePickerController相机预览是横向应用程序中的肖像
- Xcode链接器错误:文件太小,体系结构x86_64
- NSTimer不停止
- 为什么最后要调用super-dealloc,而不是先调用?
- 使用iPhone SDK访问iPhone的通话logging
- 我可以使用NSURLCredentialStorage进行HTTP基本authentication吗?
- viewWillDisappear:确定是否正在popup视图控制器或正在显示一个子视图控制器
- viewDidLoad在NSViewController?
- NSWindow与NSWindowCollectionBehaviorStation显示在仪表板上。 这是一个错误?