4

我有一个NSArraywith CGPoints。我想通过仅包含矩形内的点来过滤此数组。

我怎样才能制定一个NSPredicate这样的每个点都满足这个谓词:

CGRectContainsPoint(windowRect, point);

这是到目前为止的代码:

NSArray *points = [NSArray arrayWithObjects: [NSValue valueWithCGPoint:pointAtYZero] ,
                                             [NSValue valueWithCGPoint:pointAtYHeight],
                                             [NSValue valueWithCGPoint:pointAtXZero],
                                             [NSValue valueWithCGPoint:pointAtXWidth],
                                             nil];


NSPredicate *inWindowPredicate = [NSPredicate predicateWithFormat:@"CGRectContainsPoint(windowRect, [point CGPointValue])"];
NSArray *filteredPoints = [points filteredArrayUsingPredicate:inWindowPredicate];
4

1 回答 1

10

您不能使用谓词格式语法来执行此操作,但可以使用块:

NSArray *points = ...;
CGRect windowRect = ...;    
NSPredicate *inWindowPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    CGPoint point = [evaluatedObject CGPointValue];
    return CGRectContainsPoint(windowRect, point);
}];
NSArray *filteredPoints = [points filteredArrayUsingPredicate:inWindowPredicate];

请注意,Core Data 获取请求不能使用基于块的谓词。

于 2012-05-19T20:54:00.707 回答