3

我有那堂课:

@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 的过滤器有问题吗?

4

2 回答 2

8

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

NSPredicate * y1 = [NSPredicate predicateWithBlock: ^BOOL(id obj, NSDictionary *bind) {
    return ((CGPoint)[obj ballCoordinates]).y >= location.y;
}];
于 2013-04-07T21:22:38.423 回答
1

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


Edit
The block approach pointed by dasblinkenlight is a better solution.
Because it will not involve the necessity of declaring property for every thing you want to predicate on. Which will be more flexible.

于 2013-04-07T21:23:53.520 回答