2009-07-15 19 views
2

Ich habe Speicher mit Entitäten, die Coords (x, y, z) haben. Ich möchte sie mit Prädikat wie @ "sqrt (x x + y y + z * z) < Abstand" holen.Gibt es eine Möglichkeit, Funktionen in NSPredicate PrädikatWithFormat zu verwenden:

Gibt es eine Möglichkeit, dies zu tun?

Ich habe versucht, thi mit predicateWithFormat zu tun:

Ich schrieb sogar eine Menge Code, der

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] 
             ]; 

wie

sieht Aber es funktioniert nur für nicht hierarchische Ausdrücke. Das heißt, so dxExpression funktioniert gut, aber wenn ich versuche, dxSqrExpression zu verwenden, erhalte ich Fehler

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

Ich habe ohne selbst versucht, aber auch dies nicht funktioniert.

Jede Hilfe wird geschätzt, danke.

Antwort

2

glaube ich nicht, was Sie versuchen ist möglich zu tun, kann jedoch eine generische Mapping-Funktion implementieren und schreiben Sie Ihre @"sqrt(x*x + y*y + z*z) < distance" Prädikat als Funktion eines BOOL Rückkehr, die Sie als Selektor passieren in würde:

@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

okay, so alt ist, aber ich werde noch meine Körnchen Salz hinzuzufügen, da ich in das gleiche Problem nur lief. Nathans Lösung funktioniert, aber wenn der Laden groß ist, kann es teuer werden. Eine Möglichkeit zur Optimierung besteht darin, zuerst ein NSPredicate zu verwenden, das die Ergebnisse in einer Bounding Box anstelle der gesuchten Begrenzungssphäre zurückgibt. Dann können Sie die von Nathan vorgeschlagene Filtermethode verwenden, um an Genauigkeit zu gewinnen. – mprivat

-1
+0

wäre besser, etwas mit einem aktuellen Codebeispiel zu verbinden –

+0

ein Beispiel gibt es, aber es ist ein wenig schwierig herausgreifen: 'FUNKTION (Empfänger, selectorName, Argumente, ...)' Also, etwas wie; '[NSPredicate predicateWithFormat: @" FUNCTION (selbst, 'methodWithParameter: parameter2:',% @,% @) ", arg1, arg2]' –

+0

Siehe auch http://stackoverflow.com/questions/7556882/own -function-round-für-nsstring-in-nspredicate –

Verwandte Themen