2

NSMutableDictionary値を含むNSMutableArrayがあります。そのNSMutableArrayに存在する特定のディクショナリ値を特定する必要がありますか?

NSMutableArray:

tableData:

{
    {

        categories = 267;
        "category_ids" = 267;
        "created_at" = "2012-04-18 05:32:10";
        "custom_design_from" = "2010-12-03 00:00:00";
    }
    {
        categories = 267;
        "category_ids" = 267;
        "created_at" = "2012-04-18 05:32:10";
        "custom_design_from" = "2010-12-03 00:00:00";
    }
 }

特定の辞書の値を特定する必要があります。

私のコード:

if ( [tableData containsObject:[appDelegate.Product objectAtIndex:i]] ) 
{
     // Return Always false...
}
4

3 に答える 3

2

私が覚えている限り、メソッドは、配列内のすべてのインスタンスにメッセージをcontainsObject:送信することにより、指定されたオブジェクトが配列に含まれているかどうかを確認します。isEqual:NSDictionaryクラスにはメソッドisEqualToDictionaryがあります。これは辞書のコンテンツを比較します。あなたはこのようなsmthを作ることを試みることができます

- (BOOL) dictionaryArray:(NSMutableArray*)array containsDictionary:(NSDictionary*)givenDictionary
{
    BOOL result = NO;

    for( NSDictionary* dict in array )
    {
        if( [dict isEqualToDictionary:givenDictionary] )
        {
            result = YES;
        }
    }

    return result;
}

配列に特定の辞書が含まれている場合、このメソッドは次のように呼び出すことで返されます。

NSDictionary* dict = [appDelegate.Product objectAtIndex:i];
if ( [self dictionaryArray:tableData containsDictionary:dict] )
{
    // do what you need
}
于 2012-06-06T12:06:33.197 に答える
0

これは、2つの辞書に同じデータが含まれているが、同じオブジェクトではない場合に発生する可能性があります。たとえば、(NSDictionary

NSDictionary *d1 = [NSDictionary dictionaryWithObject:@"1" forKey:@"1"];
NSDictionary *d2 = [NSDictionary dictionaryWithObject:@"1" forKey:@"1"];
if(d1 == d2)
   //Does note get called

s1にはs2と同じデータがありますが、オブジェクトが異なるため、通常の同等性テストは機能しません。

それはおそらくあなたに起こっていることですあなたは同じデータ構造を持つ2つの辞書を持っているかもしれませんが、それらは実際には同じオブジェクトではありません

NSDictionaryで実際の文字列またはIDをテストすることにより、辞書についてさらに詳しく説明する必要があります。

于 2012-06-06T12:01:13.150 に答える
0

同一データを含む2つのオブジェクトは、通常、同一ではありません。例:

NSMutableArray* array1 = [NSMutableArray arrayWithObjects:@"a", nil];
NSMutableArray* array2 = [NSMutableArray arrayWithObjects:@"x", @"y", nil];
NSMutableArray* array3 = array2;

もちろん、array1はarray2とは異なるオブジェクトですが、array2とarray3は同じオブジェクトです。

1: a
2: x, y
3: x, y

それでは、そのうちの1つを変更しましょう。

[array1 replaceObjectAtIndex:0 withObject:@"x"];
[array1 addObject:@"y"];

これで、3つの配列すべてに同じ内容が含まれますが、それでもarray1とarray2は異なるオブジェクトです。

1: x, y
2: x, y
3: x, y

別の変更を行いましょう:

[array2 addObject:@"z"];

array1はarray2とは異なるオブジェクトであるため、array2を変更してもarray1には影響しませんでした。ただし、array2はarray3と同じです(array2とarray3は、同じものの2つの名前にすぎません)。

1: x, y
2: x, y, z
3: x, y, z
于 2012-06-06T12:23:51.930 に答える