在2D阵列中使用NSPredicate

Fli*_*per 2 iphone memory-management objective-c multidimensional-array nspredicate

这个问题基于我上一个问题的相同应用程序/来源,可以在这里找到:

如何使用Objective-C中的类来管理内存?

我有一个嵌套的数组,打印出来时看起来像这样(我只复制并粘贴了它的一小部分).

(
        (
        <Term: 0x4256420>,
        <Term: 0x420fa40>,
        <Term: 0x4257bd0>,
        <Term: 0x4257cf0>,
        <Term: 0x4257d90>,
        <Term: 0x4257e30>
    ),
        (
        <Term: 0x4257e50>,
        <Term: 0x4257f90>,
        <Term: 0x4257fb0>,
        <Term: 0x42580e0>,
        <Term: 0x4258170>,
        <Term: 0x4258210>,
        <Term: 0x4258230>,
        <Term: 0x4258360>,
        <Term: 0x4258400>,
        <Term: 0x42584a0>,
        <Term: 0x4258540>,
        <Term: 0x42585e0>,
        <Term: 0x4258670>,
        <Term: 0x4258710>
    ),
Run Code Online (Sandbox Code Playgroud)

这是我的表的搜索部分的代码:

- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section 
{
    // Normal table
    if (aTableView == self.tableView) return [[self.sectionArray objectAtIndex:section] count];

    // Search table
    //NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", self.searchBar.text];
    //self.filteredArray = [self.crayonColors filteredArrayUsingPredicate:predicate];
 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", self.searchBar.text];
    self.filteredArray = [[self.sectionArray objectAtIndex:section] filteredArrayUsingPredicate:predicate];


    return self.filteredArray.count;
}
Run Code Online (Sandbox Code Playgroud)

我收到错误,我无法分配足够的空间,这意味着我必须做错事,我只是无法弄清楚是什么.

上面方法中搜索部分的注释部分可以正常工作,但是crayonColors只是NSStrings的一个简单的NSMutableDictionary,并且没有嵌套在其中的数组.

提前致谢!

Dav*_*ong 11

据我所知,你不能用一个谓词做到这一点.但是,您可以使用键路径运算符和两个单独调用中的谓词来完成此操作.

所以,你有一系列术语数组.您需要一个名称包含"A"的单个术语数组(例如).这是你做的:

NSArray * allTerms = ...; //your array of arrays of terms
NSArray * collapsedTerms = [allTerms valueForKeyPath:@"@unionOfArrays.self"];

NSPredicate * filter = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", @"A"];
NSArray * filteredTerms = [collapsedTerms filteredArrayUsingPredicate:filter];
Run Code Online (Sandbox Code Playgroud)

这里的魔力就是一valueForKeyPath:点点.在@unionOfArrays操作者取对象的数组的数组,并返回对象的数组.这是它正在做的事情:NSArray它将打破关键路径.,给予它@unionOfArraysself.它将valueForKeyPath:使用第二位(self)进行递归和调用,并且它将返回一个数组数组.然后它将所有这些数组混合成一个数组,忽略重复.(如果要删除重复项,请@distinctUnionOfArrays改用)

一旦我们拥有了那个对象数组,我们就可以使用一个简单的name CONTAINS 'blah'谓词来正常过滤它.

(我以为我可能能够使用它来使用它SUBQUERY,但这是一个奇怪的野兽,对我来说没有什么是明显的.)

对于超级强悍,你可以用KickingBear的集合扩展(一个方法调用做到这一点可在这里),但我会强烈建议不要使用这样的黑客在生产环境.:)

  • 旁注:如果你的数组包含字典,你需要将键路径更改为`@ unionOfArrays.@ self`,因为在原始的keypath` @ unionOfArrays.self`中,`self`部分被解释为从中检索对象的键.你的词典...... (9认同)