有没有办法在NSPredicate predicateWithFormat中使用函数:

时间:2009-07-15 12:42:49

标签: iphone core-data fetch

我有实体存储有coords(x,y,z)。 我想通过使用像@“sqrt(x x + y y + z * z)< distance”这样的谓词来获取它们。

有没有办法做到这一点?

我试过用predicateWithFormat做这个:

我甚至编写了许多看起来像

的代码
NSExpression * dxExpression = [NSExpression expressionForFunction:@"from:subtract:" 
   arguments:[NSArray arrayWithObjects:
              [NSExpression expressionForConstantValue: [NSNumber numberWithFloat:currX]],
              [NSExpression expressionForKeyPath:@"self.xCoord"], nil]
                                    ];
NSExpression * dxSqrExpression = [NSExpression expressionForFunction:@"multiply:by:" 
    arguments:[NSArray arrayWithObjects:dxExpression, dxExpression, nil]
                                      ];

但它仅适用于非分层表达式。即,所以dxExpression工作正常,但是当我尝试使用dxSqrExpression时,我收到错误

Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: 'Unsupported function expression (-140.857 - #self.xCoord) * (-140.857 - #self.xCoord)'

我尝试过没有自我,但这也行不通。

任何帮助将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:2)

我不认为你想要做什么是可能的,但你可以实现一个通用的映射函数并将你的@"sqrt(x*x + y*y + z*z) < distance"谓词重写为一个返回BOOL的函数,你将传入作为选择者:

@implementation NSArray(Filtering)
- (NSArray*)arrayByMappingArrayUsingSelector:(SEL)selector, ... {
  NSInvocation* invocation;
  va_list arguments;

  if (selector && [self lastObject]) {
    va_start(arguments, selector);
    invocation = [NSInvocation invocationUsingSelector:selector onTarget:[self lastObject] argumentList:arguments];
    va_end(arguments);
  }

  NSMutableArray *filteredArray = [NSMutableArray array];
  BOOL returnValue;
  for(id object in self) {
    [invocation invokeWithTarget:object];
    [invocation getReturnValue:&returnValue];

    if(ret) [filteredArray addObject:object];
  }

  return filteredArray;
}
@end

答案 1 :(得分:-1)