gpt4 book ai didi

iphone - 在二维数组中使用 NSPredicate

转载 作者:行者123 更新时间:2023-12-03 20:20:24 27 4
gpt4 key购买 nike

这个问题基于与我之前的问题相同的应用程序/来源,可以在此处找到:

How to manage memory using classes in 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>
),

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

- (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;
}

我收到错误消息,指出我无法分配足够的空间,这意味着我一定做错了什么,我只是不知道是什么。

上述方法中搜索部分的注释掉部分有效,但 crayonColors 只是 NSStrings 的一个简单的 NSMutableDictionary,并且内部没有嵌套数组。

提前致谢!

最佳答案

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

所以,你有一个术语数组的数组。您需要一个名称包含“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];

这里的神奇之处在于 valueForKeyPath: 位。 @unionOfArrays operator接受一个对象数组的数组,并返回一个对象数组。它正在做的事情如下:NSArray 将通过 . 分解键路径,给它 @unionOfArraysself。它将使用第二位 (self) 递归并调用 valueForKeyPath: ,并返回一个数组数组。然后它将把所有这些数组混合到一个数组中,忽略重复项。 (如果您想删除重复项,请使用 @distinctUnionOfArrays 代替)

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

(我想我也许可以使用 SUBQUERY 让它工作,但这是一个奇怪的野兽,对我来说没有什么是立即显而易见的。)

对于 super 勇敢的人来说,您可以使用 KickingBear 的集合扩展 ( available here ) 通过单个方法调用来完成此操作,但我强烈建议不要在生产环境中使用类似的 hack。 :)

关于iphone - 在二维数组中使用 NSPredicate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4559427/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com