Сравните два NSMutableArray

У меня есть NSMutableArray, содержащий значения NSMutableDictionary. Я должен определить, существует ли конкретное значение словаря в этом NSMutableArray или нет?

NSMutableArray:

данные таблицы:

{
    {

        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...
}

person Myaaoonn    schedule 06.06.2012    source источник


Ответы (3)


Насколько я помню, метод containsObject: проверяет, содержит ли массив заданный объект, отправляя сообщение isEqual: всем экземплярам в нем. Класс NSDictionary имеет метод isEqualToDictionary: который сопоставляет содержимое словаря. Вы можете попробовать сделать что-то вроде этого

- (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
}
person Morion    schedule 06.06.2012

Это может произойти, если 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.

person Omar Abdelhafith    schedule 06.06.2012
comment
Внутренний механизм в iOS гарантирует, что два NSString-Object идентичны, если их содержимое идентично. Итак, в вашем примере s1 и s2 — это два имени одного и того же объекта. Но это верно только для объектов типа NSString. - person Hubert Schölnast; 06.06.2012

Два объекта, которые содержат идентичные данные, обычно не идентичны. Пример:

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

Теперь, конечно, массив1 — это другой объект, чем массив2, а массив2 и массив3 — один и тот же объект.

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

Итак, давайте изменим один из них:

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

Теперь все три массива имеют одинаковое содержимое, но массив 1 и массив 2 по-прежнему являются разными объектами:

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

Сделаем еще одно изменение:

[array2 addObject:@"z"];

Поскольку массив1 отличается от массива2, изменение массива 2 не повлияло на массив1. Но массив2 идентичен массиву3 (массив2 и массив3 — это просто два имени одного и того же):

1: x, y
2: x, y, z
3: x, y, z
person Hubert Schölnast    schedule 06.06.2012