2011-10-18 82 views
7

是否可以評估NSArray上的NSPredicate,而不讓NSPredicate開始過濾掉數組中的對象?評估NSArray上的NSPredicate(沒有過濾)

舉例來說,假設我有以下謂詞只是檢查對象的數量在一個數組:

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

這會崩潰,因爲預解碼會嘗試恢復「計數」從第一個對象鍵在數組中而不是數組本身。

+0

看來你必須用* list * not * @「123」*來評估。您可以使用與* NSArray *的* count *方法等效的SIZE運算符。 – EmptyStack

+0

你是對的,我只是修正了錯字 – cfischer

回答

13

使用SIZE操作者的NSPredicate這相當於計數方法的NSArray

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

你爲什麼要經歷這條相當迂迴的路線?直接比較'count'到'3'即可。 –

+5

@Jacob Relkin,是的。這真的是最好的方式。但OP想知道爲什麼他的謂詞不起作用,而不是最簡單的方法來比較數組的數量;-) – EmptyStack

+0

謝謝。我用這個來過濾一個字典數組,通過刪除其中包含一個鍵和空數組的條目。 –

1

例如,您可以創建方法類別你需要:

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

和.m文件執行這樣的:

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

希望,它幫助。

9

在你的謂詞格式字符串中使用[SIZE]另一種方法是做到這一點:

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

@countsimple collection keypath operators之一,是非常有用的。使用它比[SIZE]更常見,雖然兩者都很好。