由CGPoint NSPredicate过滤器类

时间:2013-04-07 21:14:37

标签: objective-c nspredicate cgpoint

我有那个班:

@interface Field : NSObject
@property CGPoint fieldCoordinates;
@property CGPoint ballCoordinates;
@end

和我尝试过滤此类对象的NSArray:

NSPredicate * y1 = [NSPredicate predicateWithFormat:@"ballCoordinates.y >= %@",location.y];
NSArray * filtered = [self.fieldsArray filteredArrayUsingPredicate:y1];

但得到错误:

  

由于未捕获的异常'NSUnknownKeyException'而终止应用,   原因:'[valueForUndefinedKey:]:这个   class不是键码y的关键值编码。'

NSPredicate有CGPoint过滤器的问题吗?

2 个答案:

答案 0 :(得分:8)

是的,NSPredicateCGPoint有问题,因为它是struct,而不是符合键值的Objective-C类。您可以使用块编写谓词,如下所示:

NSPredicate * y1 = [NSPredicate predicateWithBlock: ^BOOL(id obj, NSDictionary *bind) {
    return ((CGPoint)[obj ballCoordinates]).y >= location.y;
}];

答案 1 :(得分:1)

CGPoint不是一个对象,它是一个普通的旧C结构 您可以通过在Field类上创建看起来像这样的readonly属性来绕过它。 @property (nonatomic, readonly) CGFloat yBallCoordinates;
- (CGFloat)yBallCoordinates { return self.ballCoordinates.y; }


编辑
由dasblinkenlight指出的块方法是更好的解决方案 因为它不需要为你想要预测的每件事声明属性。哪个会更灵活。