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提出的块方法是更好的解决方案。
因为它不需要为每个你想断言的事物声明属性。这将更加灵活