3

我试图确定两个 NSSet 是否“相等”,但不是 isEqualToSet 的意义上的。两个集合中的项是同一个类但不是同一个对象,甚至是对同一个对象的引用。他们拥有一个相同的属性——我们称之为“名称”。

我最好的选择是将这两组进行比较以进行简单的组计数测试,然后是更复杂的 objectsPassingTest: 在一组中的每个项目上,确保同名的项目在另一组中?我希望有更简单的方法来处理这种情况。

4

3 回答 3

3

我遇到了同样的问题,但我需要同时比较多个属性(具有属性NameId的类User)。

我通过添加一个返回具有类所需属性的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 是包含User对象的 NSSet。

于 2013-03-15T12:28:15.423 回答
2

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

if ([[set1 valueForKey:@"name"] isEqualToSet:[set2 valueForKey:@"name"]]) {
    // the sets match your criteria
}
于 2010-11-07T04:19:51.123 回答
0

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

无论您使用哪种方法,请考虑这样一个事实,即它可能不会非常有效。这可能是不可避免的,但可能有比其他方法更好的解决方法。深思熟虑。

于 2010-11-07T03:56:07.987 回答