使用NSPredicate过滤NSArray

时间:2016-05-10 19:03:10

标签: ios objective-c nsarray nspredicate

我的代码:

-(NSArray *)searchTeamsWithPlayerPharse:(NSMutableArray *)teams phrase:(NSString *)phrase

{

   NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:@"rel_Players.fullName CONTAINS[c] %@" ,phrase];
   NSArray *searchResult = [teams filteredArrayUsingPredicate:searchPredicate];


    return searchResult ;
}

它不起作用。在数组中我有Team对象。团队与球员有关系,我希望filtr与这种关系,并发现只有球员的球队有fullName的解析。如何更改此NSPredicate

1 个答案:

答案 0 :(得分:1)

ANY运算符应该有效:

NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:@"ANY rel_Players.fullName CONTAINS[c] %@" ,phrase];

其他一些评论:

  • rel_前缀不常见且不必要:复数形式的播放器就足够了,下划线可以省略,因为新单词的开头是用大写字母标记的(驼峰式)。
  • 该方法不需要采用可变数组参数。这会将用例限制为NSMutableArray类型的参数。如果您将参数类型更改为NSArray *,则可以使用NSArrayNSMutableArray的实例。
  • 该方法不适用于实例上下文:它没有self的单一访问权限。你可以用它来制作一个函数或者 - 我希望它 - 使它成为NSArray的方法。

将它们结合在一起:

@interface NSArray(TeamPlayerAddition)
-(NSArray *)teamsWithPlayerPharse:(NSString *)phrase
@end

@implementation NSArray(TeamPlayerAddition)
-(NSArray *)teamsWithPlayerPharse:(NSString *)phrase
{
  NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:@"ANY rel_Players.fullName CONTAINS[c] %@" ,phrase];
  return [self filteredArrayUsingPredicate:searchPredicate];
}
@end