我有那个班:
@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过滤器的问题吗?
答案 0 :(得分:8)
是的,NSPredicate
与CGPoint
有问题,因为它是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指出的块方法是更好的解决方案
因为它不需要为你想要预测的每件事声明属性。哪个会更灵活。