Сравнение NSSets по одному свойству - PullRequest
3 голосов
/ 07 ноября 2010

Я пытаюсь определить, являются ли два NSSets "равными", но не в смысле isEqualToSet.Элементы в двух наборах относятся к одному и тому же классу, но не являются одним и тем же объектом или даже ссылками на один и тот же объект.Они будут иметь одно и то же свойство - давайте назовем его «имя».

Лучше всего сравнить эти два набора, чтобы провести простой тест на количество наборов, а затемcomplex objectsPassingTest: для каждого элемента в одном наборе, чтобы убедиться, что элемент с таким же именем находится в другом наборе?Я надеюсь, что есть что-то более простое, чтобы справиться с этим делом.

Ответы [ 3 ]

3 голосов
/ 15 марта 2013

У меня была та же проблема, но мне нужно было сравнить несколько свойств одновременно (класс Пользователь со свойствами Имя и Идентификатор ).

Я решил эту проблему, добавив метод, возвращающий NSDictionary со свойствами, необходимыми для класса:

- (NSDictionary *)itemProperties
{
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    [dict setObject:self.name forKey:@"name"];
    [dict setObject:self.id forKey:@"id"];
    return dict;
}

и затем используя valueForKey:, как упомянул Кевин Баллард:

BOOL userSetsEqual = [[userSet1 valueForKey:@"itemProperties"]
    isEqualToSet:[userSet2 valueForKey:@"itemProperties"]];

... где userSet1 и userSet2 были NSSets, которые содержали Пользователь объекты.

2 голосов
/ 07 ноября 2010

Вы можете просто позвонить valueForKey: на оба набора и сравнить результаты.

if ([[set1 valueForKey:@"name"] isEqualToSet:[set2 valueForKey:@"name"]]) {
    // the sets match your criteria
}
0 голосов
/ 07 ноября 2010

Просматривая документацию, кажется, что нет никакого способа по-настоящему разобраться с вашим особым случаем. Вам придется написать какой-то специальный код, чтобы справиться с этим. Лично я бы порекомендовал использовать -sortedArrayUsingDescriptors:, а затем сравнивать массивы, но это только я. Вы также можете перечислить один набор, затем сузить другой, используя -filteredSetUsingPredicate: и получить его count.

Какой бы метод вы ни использовали, учтите тот факт, что он, вероятно, не будет суперэффективным. Это может быть неизбежно, но, вероятно, есть способы сделать это лучше, чем другие. Пища для размышлений.

...