您的谓词可以访问对象的属性,该属性按名称保存数组;我list
在下面的示例中调用了它。然后使用ANY
关键字检查数组中的所有值,并BETWEEN
确定这些值是否在您选择的范围内。
#import <Foundation/Foundation.h>
@interface Grumolo : NSObject
@property (copy, nonatomic) NSArray * list;
@end
@implementation Grumolo
- (NSString *)description
{
return [NSString stringWithFormat:@"%@: %p, list: %@", NSStringFromClass([self class]), self, [self list]];
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
float target = 234;
float delta = 0.8;
NSPredicate * p = [NSPredicate predicateWithFormat:@"ANY list BETWEEN %@", @[@(target-delta), @(target+delta)]];
NSArray * yes = @[@234, @10, @100];
NSArray * yes2 = @[@0, @16, @234];
NSArray * no = @[@1, @2, @3];
Grumolo * g1 = [Grumolo new];
[g1 setList:yes];
Grumolo * g2 = [Grumolo new];
[g2 setList:yes2];
Grumolo * g3 = [Grumolo new];
[g3 setList:no];
NSLog(@"%@", [@[g1, g2, g3] filteredArrayUsingPredicate:p]);
}
return 0;
}
您可能还想尝试predicateWithBlock:
,它可以让您表达您正在尝试对每个数组进行传统循环执行的操作,YES
如果您找到符合您的标准的元素并且NO
如果您用尽列表,则返回。
NSPredicate * pb = [NSPredicate predicateWithBlock:^BOOL(Grumolo * evaluatedObject, NSDictionary *bindings) {
NSArray * list = [evaluatedObject list];
__block BOOL result = NO;
[list enumerateObjectsUsingBlock:^(NSNumber * obj, NSUInteger idx, BOOL *stop) {
BOOL moreThanLower = (NSOrderedDescending == [obj compare:@(target-delta)]);
BOOL lessThanUpper = (NSOrderedAscending == [obj compare:@(target+delta)]);
if( moreThanLower && lessThanUpper ){
*stop = YES;
result = YES;
return;
}
}];
return result;
}];