2

我存储了具有坐标(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)'

我试过没有自我,但这也不起作用。

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

4

1 回答 1

2

我认为您尝试做的事情是不可能的,但是您可以实现通用映射函数并将@"sqrt(x*x + y*y + z*z) < distance"谓词重写为返回 a 的函数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
于 2009-07-15T13:05:11.697 回答