我有实体存储有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)'
我尝试过没有自我,但这也行不通。
任何帮助将不胜感激,谢谢。
答案 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)