【问题标题】:Filtering NSArray with NSPredicate使用 NSPredicate 过滤 NSArray
【发布时间】:2016-05-10 19:03:09
【问题描述】:

这是我的代码:

-(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 对象。球队与球员有关系,我想用这种关系进行过滤,发现只有球员的球队才有全名。如何改变这个 NSPredicate

【问题讨论】:

  • rel_Players 是一对多的关系吗?
  • 是的。 1 支球队有很多球员。

标签: ios objective-c nsarray nspredicate


【解决方案1】:

ANY 运算符应该可以工作:

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

一些补充说明:

  • rel_ 前缀不常见且不必要:复数形式的 player 就足够了,下划线可以省略,因为新单词的开头用大写字符(驼峰式)标记。
  • 该方法不需要采用可变数组参数。这将用例限制为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

【讨论】:

  • 为什么要向NSArray 添加一个与NSArray 无关的单个类的方法?将该方法作为类方法添加到Team,如果有的话。
  • 它必须对数组做一些事情。 self 指向数组。数组是任何对象的唯一链接。有一个专门的扩展并不是说它具有全球意义。
猜你喜欢
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
相关资源
最近更新 更多