从 NSArray 动态生成 NSPredicate

Posted

技术标签:

【中文标题】从 NSArray 动态生成 NSPredicate【英文标题】:dynamically generate NSPredicate from an NSArray 【发布时间】:2012-08-09 18:29:29 【问题描述】:

我有大量不同的 NSObject 类型,它们都具有不同的属性,我正在尝试抽象出一个方法,该方法允许我通过简单地传入我希望过滤的属性的 NSArray 来过滤对象的 NSArray在。我过滤的数字键可能从 1 到其他任何值。

这里是一个过滤 NSArray 的例子

NSArray *filterBy = [NSArray arrayWithObjects:
                       @"ManufacturerID",
                       @"CustomerNumber",nil];

这些键也存在于我正在过滤的 NSArray 的对象中,所以基本上这需要生成如下内容:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"%K == %@ AND %K == %@",
                       [filterBy objectAtIndex:0], 
                       [items valueForKey: [filterBy objectAtindex:0],
                       [filterBy objectAtIndex:1], 
                       [items valueForKey: [filterBy objectAtIndex:1]];

这会产生类似:ManufacturerID==18 AND CustomerNumber=='WE543'

可以这样做吗?

【问题讨论】:

【参考方案1】:

这很容易。看看吧:

NSMutableArray *subpredicates = [NSMutableArray array];
for (NSString *filterKey in filterBy) 
  NSString *filterValue = [items valueForKey:filterKey];
  NSPredicate *p = [NSPredicate predicateWithFormat:@"%K = %@", filterKey, filterValue];
  [subpredicates addObject:p];

NSPredicate *final = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates];

【讨论】:

太棒了 - 我知道必须有这样的东西供我使用! 正是我想要的。谢谢

以上是关于从 NSArray 动态生成 NSPredicate的主要内容,如果未能解决你的问题,请参考以下文章

iOS本地动态验证码生成-b

如何从包含任意对象的 NSSet 创建排序的 NSArray?

UITabBarController动态添加TabBarItem

UIPickerView 选择更新 UITextFields 的 NSArray

从 NSArray 获取单个属性的 NSArray

从 NSArray 中删除对象