2009-07-15 13 views
2

私は座標(x、y、z)を持つエンティティを持つストアを持っています。 @ "sqrt(x x + y y + z * z)<距離のような述語を使用してそれらをフェッチしたいと思います。NSPredicate predicateWithFormatで関数を使用する方法はありますか:

これを行う方法はありますか?私はpredicateWithFormatとTHIを行うことを試みた

私も

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

私はあなたが何をしようとしてはないと思うことが可能であり、しかし、あなたは、一般的なマッピング機能を実装して、セレクタとして渡すBOOLを返す関数としてあなた@"sqrt(x*x + y*y + z*z) < distance"述語を書き換えることができます:

@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

を見ますNathanのソリューションは機能しますが、店舗が大きい場合は高価になる可能性があります。最適化の1つの方法は、最初に、実際に探している境界の球の代わりにバウンディングボックスで結果を返すNSPredicateを使用することです。次に、Nathanが提案したフィルタメソッドを使用して精度を向上させることができます。 – mprivat

-1

これは道古いですが、私はまだ、私はちょうどこれと同じ問題に遭遇したので、塩の私の穀物を追加するつもりです。オーケーhttp://moottoot.blogspot.com/2008/01/oooh-nspredicate-functions.html

+0

は、実際のコード例例があり –

+0

含めて何かにリンクする方が良いだろうが、それは選ぶことが少し難しいです: 'FUNCTION(受信機、selectorName、引数、...)' ので、何かのようなもの; '[NSPredicate predicateWithFormat:@" FUNCTION(self、 'methodWithParameter:parameter2:'、%@、%@) "、arg1、arg2]' –

+0

も参照してください。http://stackoverflow.com/questions/7556882/own -function-round-for-nsstring-in-nspredicate –

関連する問題