2010-11-07 68 views
3

我试图确定两个NSSets是否“相等”,但不是isEqualToSet。两组中的项目是相同的类,但不是相同的对象,或者甚至是对同一对象的引用。他们有一个属性是相同的,但我们称之为'名称'。单个属性比较NSSets

我最好在比较这两组来做一个简单的集合计数测试,然后一个更复杂的objectsPassingTest:在一个集合中的每个项目上,确保具有相同名称的项目在另一个集合中?我希望有更简单的办法来处理这种情况。

回答

2

您可以在两组上都调用valueForKey:并比较结果。

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

哇,这太简单了。调用valueForKey:在具有属性的NSSet上返回一组对象,该对象是原始内容的键控属性。 – Nick 2010-11-07 16:39:22

0

通过文档查看,似乎没有办法真正处理你的这种特殊情况。你将不得不编写一些自定义代码来处理这个问题。就个人而言,我会建议使用-sortedArrayUsingDescriptors:,然后比较阵列,但这只是我。你也可以通过一组枚举,然后使用-filteredSetUsingPredicate:缩小另一个,并得到它的count

无论您使用哪种方法,都要考虑其可能不会超高效的事实。这可能是不可避免的,但是可能有些方法可以比其他方法更好。食物的思想。

3

我有同样的问题,但我需要多个属性的同时比较(类用户与性能名称标识)。

我解决了这个通过添加返回一个的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。