2010-11-07 2 views
3

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

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

ответ

2

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

if ([[set1 valueForKey:@"name"] isEqualToSet:[set2 valueForKey:@"name"]]) { 
    // the sets match your criteria 
} 
+0

Ничего себе, это на удивление просто. Вызов valueForKey: на NSSet с свойством возвращает набор, в котором объекты являются ключевыми свойствами исходного содержимого. – Nick

0

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

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

3

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

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

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

, а затем с помощью valueForKey: как упомянуто Kevin Ballard:

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^