2011-10-18 13 views
7

Czy jest możliwa ocena NSPredicate na NSArray, bez konieczności rozpoczęcia odfiltrowania obiektów NSPredicate w tablicy?Ocena NSPredicate na NSArray (bez filtrowania)

Załóżmy, że mam następujący predykat że tylko sprawdza liczbę obiektów w tablicy:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"count == 3"]; 
NSArray *list = [NSArray arrayWithObjects:@"uno", @"dos", @"volver", nil]; 
BOOL match = [pred evaluateWithObject:list]; 

ten padnie, jak pred postara się odzyskać „liczyć” klucz od pierwszego obiektu w tablicy zamiast samej tablicy.

+0

Wygląda na to, że musisz ocenić z * list * nie * @ "123" *. Możesz użyć operatora SIZE, który jest równoważny * count * method of * NSArray *. – EmptyStack

+0

Masz rację, właśnie naprawiłem literówkę – cfischer

Odpowiedz

13

pomocą SIZE operatora NSPredicate co odpowiada zliczania sposobu NSArray.

NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF[SIZE] == 3"]; 
NSArray *list = [NSArray arrayWithObjects:@"uno", @"dos", @"volver", nil]; 
BOOL match = [pred evaluateWithObject:list]; 
+0

Dlaczego miałbyś przejść tę raczej okrężną trasę? Wystarczy porównać "count" do "3" bezpośrednio. –

+5

@Jacob Relkin, Tak. To naprawdę najlepszy sposób na zrobienie tego. Ale OP chciał wiedzieć, dlaczego jego predykat nie działa, nie jest to najłatwiejszy sposób porównania liczby tablic ;-) – EmptyStack

+0

Dzięki. Użyłem tego do filtrowania tablicy słowników, usuwając wpisy, w których znajdował się jeden klucz i pusta tablica. –

1

Na przykład, możesz utworzyć kategorię z metod trzeba:

@interface NSPredicate (myCategory) 
    - (BOOL)evaluateWithArray:(id)array; 
    // other methods 
@end 

aw .m pliku wdrożyć go tak:

- (BOOL)evaluateWithArray:(id)array { 
    if ([array isKindOfClass:[NSArray class]]) 
     return [self evaluateWithObject:array]; 
    return NO; 
} 

Hope, to pomaga.

9

Alternatywą korzystania [SIZE] w formacie orzecznik ciąg jest, aby to zrobić:

NSPredicate *p = [NSPredicate predicateWithFormat:@"@count = 3"]; 

@count jest jednym z simple collection keypath operators i jest bardzo przydatny. O wiele częściej używa się go niż [SIZE], chociaż oba są w porządku.

Powiązane problemy