と呼ばれるカスタムクラスがcard
あり、ランダムなサイズのカードの配列から10枚の一意のカードのセットを作成する必要があります。また、ホワイトリストに登録されているカードを最初に含めて、常に含まれるようにする必要があります。
私の問題は、ホワイトリストのカード(およびホワイトリストのみ)がセット内で重複している可能性があることです。ランダムに追加されたカードが複製されることはなく、カウントは常に正しいです(10)。なぜisEqual
時々うまくいくように見えるのか理解できませんが、常にではありません。
ここで私はセットを作成します(これrandoms
は、選択される可能性のあるカードの配列です)。
NSMutableSet *randomCards = [NSMutableSet setWithCapacity:10];
[randomCards addObjectsFromArray:whiteListArray];
while ([randomCards count] < 10) {
NSNumber *randomNumber = [NSNumber numberWithInt:(arc4random() % [randoms count])];
[randomCards addObject:[randoms objectAtIndex:[randomNumber intValue]]];
}
ここで回答された別の質問に基づいてisEqual
、クラスのメソッドを無効にしました。card
- (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;
}
ホワイトリストカードを追加した場合を除いて、完全に機能しているようですが、どのようにして重複が発生するのかわかりません(ただし、2部を超えることはありません)。