Есть ли способ использовать функции в NSPredicate ForexateWithFormat: - PullRequest
2 голосов
/ 15 июля 2009

У меня есть хранилище с объектами, у которых есть координаты (x, y, z). Я хочу получить их, используя предикат типа @ "sqrt (x x + y y + z * z) <расстояние". </p>

Есть ли способ сделать это?

Я пытался сделать это с помощью предиката WithFormat:

Я даже написал много кода, похожего на

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 ]

2 голосов
/ 15 июля 2009

Я не думаю, что то, что вы пытаетесь сделать, возможно, однако вы могли бы реализовать универсальную функцию отображения и переписать свой предикат @"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
0 голосов
/ 21 июня 2011
...