8

次のNSArrayについて考えてみます。

NSArray *dataSet = [[NSArray alloc] initWithObjects:
                 [NSDictionary dictionaryWithObjectsAndKeys:@"abc", @"key1", @"def", @"key2", @"hij", @"key3", nil], 
                 [NSDictionary dictionaryWithObjectsAndKeys:@"klm", @"key1", @"nop", @"key2", nil], 
                 [NSDictionary dictionaryWithObjectsAndKeys:@"qrs", @"key2", @"tuv", @"key4", nil], 
                 [NSDictionary dictionaryWithObjectsAndKeys:@"wxy", @"key3", nil], 
                 nil];

この配列をフィルタリングして、キーを含む辞書オブジェクトを見つけることができます key1

// Filter our dataSet to only contain dictionary objects with a key of 'key1'
NSString *key = @"key1";
NSPredicate *key1Predicate = [NSPredicate predicateWithFormat:@"%@ IN self.@allKeys", key];
NSArray *filteretSet1 = [dataSet filteredArrayUsingPredicate:key1Predicate];
NSLog(@"filteretSet1: %@",filteretSet1);

適切に返されるもの:

filteretSet1: (
        {
        key1 = abc;
        key2 = def;
        key3 = hij;
    },
        {
        key1 = klm;
        key2 = nop;
    }
)

ここで、 NSArray内の任意のキーを含むディクショナリオブジェクトのdataSetをフィルタリングしたいと思います。

たとえば、配列を使用します。「key1」または「key3」のいずれかを含む辞書オブジェクトNSArray *keySet = [NSArray arrayWithObjects:@"key1", @"key3", nil];の配列を返す述語を作成します (つまり、この例では、3番目のオブジェクトを除くすべての辞書オブジェクトが返されます-として'key1'または'key3'のいずれも含まれていません)。

これをどのように達成するかについてのアイデアはありますか?複合述語を使用する必要がありますか?

4

3 に答える 3

9

ANYオペレーターはNSPredicateこれをカバーしています:

NSSet *keys = [NSSet setWithObjects:@"key1", @"key3", nil];

NSPredicate *key1Predicate = [NSPredicate predicateWithFormat:@"any self.@allKeys in %@", keys];
于 2012-06-20T09:00:11.227 に答える
1

これを行う:

   NSString *key = @"key1";
   NSString *key1 = @"key3";
   NSPredicate *key1Predicate = [NSPredicate predicateWithFormat:@"%@ IN self.@allKeys OR %@ IN self.@allKeys",key,key1];
   NSArray *filteretSet1 = [dataSet filteredArrayUsingPredicate:key1Predicate];
   NSLog(@"filteretSet1: %@",filteretSet1);

私にとっては完璧に機能します。お役に立てば幸い

于 2012-06-20T08:58:46.387 に答える
1

質問には回答しましたが、ブロックを使用してさらに細かくすることもできます。

NSArray *filter = [NSArray arrayWithObjects:@"key1", @"key3",nil];

NSPredicate *filterBlock = [NSPredicate predicateWithBlock: ^BOOL(id obj, NSDictionary *bind){        
    NSDictionary *data = (NSDictionary*)obj;

    // use 'filter' and implement your logic and return YES or NO
}];

[dataSet filteredArrayUsingPredicate:filterBlock];

それは、おそらく独自の方法で、必要に応じて再配置できます。

于 2012-06-20T09:24:06.563 に答える