2012-12-07 42 views
4

我有一個數組,使得當打印出來看起來像這樣的陣列:NSPredicate陣列上

 
(
     (
     databaseVersion, 
     13 
    ), 
     (
     lockedSetId, 
     100 
    ) 
) 

纔有可能使用NSPredicate(潛在地由陣列中的索引)來過濾這個。所以像這樣:給我所有行的元素0是'databaseVersion'?我知道,如果我有一組字典,我可以用一個類似於here的謂詞來做到這一點,但是我發現當使用字典並存儲大量數據時,我的內存消耗增加了(從大約80mb到大約120mb ),所以如果可能的話我會保持陣列。有關如何做到這一點的任何建議?

回答

7

這可以通過使用 「SELF [指數]」 的謂詞來完成:

NSArray *array = @[ 
    @[@"databaseVersion", @13], 
    @[@"lockedSetId", @100], 
    @[@"databaseVersion", @55], 
    @[@"foo", @"bar"] 
]; 

NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF[0] == %@", @"databaseVersion"]; 
NSArray *filtered = [array filteredArrayUsingPredicate:pred]; 
NSLog(@"%@", filtered); 

輸出:

(
     (
     databaseVersion, 
     13 
    ), 
     (
     databaseVersion, 
     55 
    ) 
) 

或者你可以使用基於塊的斷言:

NSPredicate *pred = [NSPredicate predicateWithBlock:^BOOL(NSArray *elem, NSDictionary *bindings) { 
    return [elem[0] isEqualTo:@"databaseVersion"]; 
}]; 
+1

啊很不錯。這正是我正在尋找的。只是好奇你想出了SELF [index]值。我沒有看到文檔中的任何地方? – Kyle

+1

@Zenox它是在BNF中爲謂詞格式字符串定義的:http://developer.apple.com/library/mac/documentation/cocoa/conceptual/Predicates/Articles/pBNF.html#//apple_ref/doc/uid/TP40001796 -217950 –

6

只需您可以使用ANY在NSPredicate:

它的正常工作

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF == %@", @"value"]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF contains[cd] %@", @"value"];