Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSMutableSet包含重复项_Objective C_Xcode_Nsmutableset - Fatal编程技术网

Objective c NSMutableSet包含重复项

Objective c NSMutableSet包含重复项,objective-c,xcode,nsmutableset,Objective C,Xcode,Nsmutableset,我有一个名为card的自定义类,我需要从随机大小的卡数组中创建一组10张唯一的卡。此外,我需要包括任何白名单卡第一,以确保他们总是包括在内 我的问题是白名单中的卡片(只有白名单)在集合中可能重复。随机添加的卡从不重复,计数始终正确(10)。我不明白为什么isEqual有时有效,但并不总是有效 这里是我创建集合的地方(randoms是要从中挑选的潜在卡的数组): 它似乎工作得很好,除非当我加入白名单卡片时,我不知道我是如何得到重复的(但不超过2份)。除了isEqual之外,你还需要覆盖散列 事实上

我有一个名为
card
的自定义类,我需要从随机大小的卡数组中创建一组10张唯一的卡。此外,我需要包括任何白名单卡第一,以确保他们总是包括在内

我的问题是白名单中的卡片(只有白名单)在集合中可能重复。随机添加的卡从不重复,计数始终正确(10)。我不明白为什么isEqual有时有效,但并不总是有效

这里是我创建集合的地方(
randoms
是要从中挑选的潜在卡的数组):


它似乎工作得很好,除非当我加入白名单卡片时,我不知道我是如何得到重复的(但不超过2份)。

除了
isEqual
之外,你还需要覆盖
散列

事实上,您始终需要确保这两种方法协同工作。发件人:

如果两个对象相等(由isEqual:方法确定),则它们必须具有相同的哈希值。如果在子类中定义hash并打算将该子类的实例放入集合中,那么最后一点尤为重要

像这样的方法应该会奏效:

- (NSUInteger)hash {
    return [[self cardName] hash];
}
这样,您的散列依赖于用于进行比较的相同信息


散列被数据结构(如
NSMutableSet
)用来将对象快速分组到不同的存储桶中。重要的是,如果两个对象相等,则它们具有相同的哈希值。(不过,如果两个对象具有相同的散列,但不相等,这没关系。因此,您可以始终从
散列返回相同的数字,但这样您的性能将与使用数组一样。数据结构!)

啊,太好了,非常感谢。我把自己引向了错误的道路,因为它似乎有时起作用,而其他人却不起作用。
- (BOOL)isEqual:(id)other {

if (other == self)
    return YES;
if (!other || ![other isKindOfClass:[self class]])
    return NO;
return [self isEqualToCard:other];

}

- (BOOL)isEqualToCard:(Card *)myCard {

if (self == myCard) {
    return YES;
}
if ([self cardName] != [myCard cardName] && ![(id)[self cardName] isEqual:[myCard cardName]])
    return NO;

return YES;
}
- (NSUInteger)hash {
    return [[self cardName] hash];
}