2013-03-08 5 views
0

Как вы проверить, если два NSMutableSets равны (же члены, такое же количество членов)?Равенство двух NSMutableSets Использование пользовательских атрибутов класса

Моя реализация isEqualToSet не работает.

// members is a NSMutableSet of AUser objects 

// users is also a NSMutableSet of AUser objects, it is an attribute of instances of the AGroup class 

[[group valueForKey:@"users"] isEqualToSet:members] 


AGroup 
- users 

AUser 
- name (String) 

Как проверить, соответствуют ли наборы, проверяя их атрибуты имени?

Извините за недостаток знаний, это мой первый раз с программированием на iOS, поэтому я знаю только основы на данный момент.

+2

'isEqualToSet:' должен работать. возможно, это проблема объектов в наборе. они должны реализовать 'isEqual:' и 'hash' –

+0

Какое содержимое вашего набора? строки или цифры или другие? «isEqualToSet» может смотреть только на адреса объектов в наборе, чтобы определить равенство. Но, смотря на приведенный выше комментарий, возможно, он также смотрит на содержимое определенных типов объектов. –

+0

О, хорошо. Спасибо, что помогли мне понять проблему. Я опубликую обновление до вопроса с ошибкой. Объектами в наборе являются два экземпляра пользовательских классов, которые имеют атрибут String, хотя я не знаю, как проверять атрибуты. – GangstaGraham

ответ

2

Если вы хотите проверить, если соответствующие name атрибуты идентичны, то должно работать:

[[group valueForKeyPath:@"users.name"] isEqualToSet:[members valueForKey:@"name"]] 

[group valueForKeyPath:@"users.name"] возвращает набор имен всех пользователей в группе, и [members valueForKey:@"name"] возвращает набор имена всех пользователей в наборе members.

Обновление: Как стало ясно в комментариях, members представляет собой набор строк, а не набор пользовательских объектов. Поэтому код упрощается до:

[[group valueForKeyPath:@"users.name"] isEqualToSet:members] 
+0

Во-первых, @martin вы сэр - жемчужина! Спасибо, что помогли мне и спасибо за помощь SO-сообществу. Я дам вам галочку и надпись, которые вы заслужили бы для типичного кода, но мой код noobish, к сожалению, немного странный. Я получаю сообщение об ошибке: '' [<__ NSCFString 0xa268260> valueForUndefinedKey:]: этот класс не является ключевым значением, совместимым с кодировкой для имени ключа. «Похоже, мне придется реализовать isEqual: и хэш, как было предложено выше. – GangstaGraham

+1

@GangstaGraham: Звучит так, как будто 'members' представляет собой набор строк, а не набор пользовательских объектов. Попробуйте '[[group valueForKeyPath: @" users.name "] isEqualToSet: members]'. –

+0

Woohoo !!!!! @martin Это сработало. Да, я просто вспомнил, что участники на самом деле представляют собой набор строк, оглядываясь на мой код, это правильно! Отличная работа. Я бы удвоил этот ответ, если бы мог. Еще раз спасибо. :) – GangstaGraham