Objective c 按CGPoint预测筛选器类

Objective c 按CGPoint预测筛选器类,objective-c,nspredicate,cgpoint,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 = [se

我有一门课:

@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:]:此 类与键y的键值编码不兼容。'


NSPredicate是否存在按CGPoint筛选的问题

是的,
NSPredicate
CGPoint
有问题,因为它是一个
结构
,不是一个符合键值的Objective-C类。您可以使用块编写谓词,如下所示:

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

CGPoint不是一个对象,它是一个普通的旧C结构。
您可以在Field类上创建一个如下所示的只读属性来解决这个问题。
@property(非原子,只读)cgloball坐标
-(CGFloat)yBallCoordinates{return self.ballcordinates.y;}


编辑
dasblinkenlight提出的块方法是更好的解决方案。
因为它不需要为每个你想断言的事物声明属性。这将更加灵活