1

マイアレイ

(
   {id:1,data:(@"macbook",@"mac mini")},
   {id:2,data:(@"ipad",@"ipod")},
   {id:3,data:(@"macbook",@"ipod")}
)

述語があります

NSString *text = @"mac";
[NSPredicate predicateWithFormat:@"(data contains[cd] %@)",text];
[array filteredArrayUsingPredicate:predicate];

しかし、辞書内の配列をループしません (私の結果は、ID 1 と 3 の 2 つのオブジェクトを含む配列になるはずです)。

4

2 に答える 2

4
NSString* text = @"mac" ;
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"any data contains[cd] %@",text] ;
NSArray* filteredArray = [theArray filteredArrayUsingPredicate:predicate] ;
于 2013-01-02T15:18:06.610 に答える
2

個人的には、NSPredicateフォーマットは非常にエラーが発生しやすいと思います。

フィルタリングするためにブロックを使用することを検討してください。NSArray

NSString * filterString = @"mac";
NSIndexSet * indexes = [array indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
    NSArray * entry = obj[@"data"];
    for (NSString * value in entry)
        if ([value rangeOfString:filterString].location != NSNotFound)
            return YES;
    return NO;
}];
NSArray * filteredArray = [array objectsAtIndexes:indexes];

確かに長くて冗長ですが、読みやすく、デバッグしやすいと思います。

于 2013-01-02T15:43:43.993 に答える