代码之家  ›  专栏  ›  技术社区  ›  netmajor

NSP按CGPoint重新分配筛选器类

  •  3
  • netmajor  · 技术社区  · 12 年前

    我有这样的课:

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

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

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

    但出现错误:

    由于未捕获的异常“NSUnknownKeyException”而终止应用程序, 原因:'[valueForUndefinedKey:]:此 类与键y的键值编码不兼容。'

    NSPredicate的CGPoint筛选有问题吗?

    2 回复  |  直到 12 年前
        1
  •  8
  •   Sergey Kalinichenko    12 年前

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

    NSPredicate * y1 = [NSPredicate predicateWithBlock: ^BOOL(id obj, NSDictionary *bind) {
        return ((CGPoint)[obj ballCoordinates]).y >= location.y;
    }];
    
        2
  •  1
  •   Vincent Bernier    12 年前

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


    编辑
    dasblinkenlight指出的块方法是一个更好的解决方案。
    因为它不会涉及到为每一个你想谓词的东西声明属性的必要性。这会更灵活。