使用NSPredicate过滤包含2D-NSDictionaries的NSArray

3

我有一个包含一些NSDictionariesNSArray,这些NSDictionaries本身也包括一个NSDictionary

NSDictionary *dict1 = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:@"cover" forKey:@"type"] forKey:@"image"];
NSDictionary *dict2 = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:@"cover" forKey:@"type"] forKey:@"image"];
NSDictionary *dict3 = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:@"back" forKey:@"type"] forKey:@"image"];
NSDictionary *dict4 = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:@"cover" forKey:@"type"] forKey:@"image"];

NSArray *myArray = [NSArray arrayWithObjects:dict1, dict2, dict3, dict4, nil];

有没有一种方法可以使用NSPredicate过滤myArray中的所有图像字典,其中类型为"cover"等。尝试像以下这样的谓词:
predicateWithFormat:@"(SELF.image.type == %@)", @"cover"]

或者

predicateWithFormat:@"(image.type == %@)", @"cover"]

但是没有成功。

谢谢提前!如果有疑问,请留言。

// 编辑

因此

NSPredicate *p = [NSPredicate predicateWithFormat:@"image.type == %@", @"cover"];

该功能正在运作中。但在我的情况下,我希望能筛选出尺寸==原始的内容。我的做法是:

NSPredicate *p = [NSPredicate predicateWithFormat:@"image.size == %@", @"original"];

但是我的应用程序崩溃了,显示以下错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSSymbolicExpression length]: unrecognized selector sent to instance

并且指向我的 filteredArrayUsingPredicate 方法。我无法看到类型和大小之间的任何区别。请看我这里数组的 NSLog。

 (
        {
        image =         {
            height = 1500;
            id = 4e5808765e73d607350059b4;
            size = original;
            type = poster;
            url = "someurl";
            width = 1000;
        };
    },
        {
        image =         {
            height = 750;
            id = 4e5808765e73d607350059b4;
            size = mid;
            type = poster;
            url = "someurl";
            width = 500;
        };
    },

有人知道为什么我尝试使用 size 而不是 type 时,它会崩溃吗?
2个回答

7

SIZE是一个保留关键字。

谓词编程指南的底部找到:

以下单词被保留:

AND、OR、IN、NOT、ALL、ANY、SOME、NONE、LIKE、CASEINSENSITIVE、CI、MATCHES、CONTAINS、BEGINSWITH、ENDSWITH、BETWEEN、NULL、NIL、SELF、TRUE、YES、FALSE、NO、FIRST、LAST、SIZE、ANYKEY、SUBQUERY、CAST、TRUEPREDICATE、FALSEPREDICATE


2
以下代码对我有效:
```html

以下代码对我有效:

```
NSDictionary *dict1 = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:@"cover" forKey:@"type"] forKey:@"image"];
NSDictionary *dict2 = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:@"cover" forKey:@"type"] forKey:@"image"];
NSDictionary *dict3 = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:@"back" forKey:@"type"] forKey:@"image"];
NSDictionary *dict4 = [NSDictionary dictionaryWithObject:[NSDictionary dictionaryWithObject:@"cover" forKey:@"type"] forKey:@"image"];

NSArray *myArray = [NSArray arrayWithObjects:dict1, dict2, dict3, dict4, nil];

NSPredicate *p = [NSPredicate predicateWithFormat:@"image.type == %@", @"cover"];
NSLog(@"%@", [myArray filteredArrayUsingPredicate:p]);

确实是这样。我不知道我的代码出了什么问题。一开始我以为我试过这个谓词(最简单的一个;))。谢谢! - choise
1
如果您提供的代码是您测试过的真实代码,那么您应该在字典中寻找字符串"poster",但是您的字典中并没有包含它 - 您只有"cover"和"back"。因此,空结果实际上是正确的。 :-) - Monolo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接