Ich habe eine Objective-C-Klasse namens FactorHelper
deren Definition unten ist. Es hat eine Eigenschaft genannt Faktoren, die eine NSMutableArray
von NSNumbers
ist. Ich habe eine benutzerdefinierte isEqual:
Methode in dieser Klasse, die wahr zurückgibt, wenn die Faktoren-Eigenschaft in den beiden FactorHelper
Objekte die gleichen Nummern haben (auch wenn die Zahlen in einer anderen Reihenfolge sind).* [NSMutableSet addObject: X] * fügt Objekt X hinzu, obwohl * [Y ist gleich: X] * gibt TRUE für ein Objekt Y zurück, das bereits im Set ist
ich versuchte, durch die Schaffung von zwei Objekten FactorHelper
eines mit 10,5,2und das andere mit 10,2,5 zu testen. Dann habe ich ein NSMutableSet
erstellt, ErstesObjekt und dann zweites Objekt hinzugefügt. Ich habe erwartet, dass das zweite Objekt nicht hinzugefügt wird, aber ich sehe, dass es hinzugefügt wird. Wenn ich durch den Code gehe, finde ich, dass von addObject aufgerufen wird und TRUE
zurückgibt. Was mache ich falsch?
UPDATE
Ändern der [NSMutableSet new]
zu [NSMutableSet alloc] init]
macht die Dinge wie erwartet.
Auch das Ändern aller TRUE, FALSE ist isEqual zu YES, NO bewirkt, dass es sich korrekt verhält (auch wenn ich es als [NSMutableSet new]
halte).
Ich habe keine Ahnung was los ist. Kann jemand bitte etwas Licht abwerfen ?!
Klassendefinition
@interface FactorHelper: NSObject
@property NSMutableArray <NSNumber *> *factors;
-(BOOL) isEqual:(FactorHelper *)other;
-(instancetype) initWithFactors:(NSMutableArray *)factors;
-(NSString *) description;
@end
@implementation FactorHelper
- (instancetype) initWithFactors:(NSMutableArray *)factors
{
self = [super init];
if (self) {
_factors = factors;
}
return self;
}
-(BOOL) isEqual:(FactorHelper *)other
{
if ([self.factors count] != [other.factors count])
{
return FALSE;
}
else
{
NSMutableDictionary <NSNumber *, NSNumber *> *myHashTable = [[NSMutableDictionary alloc] init];
for (NSNumber *nextNumber in self.factors) {
if(myHashTable[nextNumber] == nil)
{
myHashTable[nextNumber] = @(1);
}
else
{
myHashTable[nextNumber] = @([myHashTable[nextNumber] integerValue]+1);
}
}
for (NSNumber *nextNumber in other.factors)
{
if(myHashTable[nextNumber] == nil)
{
return FALSE;
}
else
{
myHashTable[nextNumber] = @([myHashTable[nextNumber] integerValue] - 1);
if ([myHashTable[nextNumber] integerValue] == 0) {
[myHashTable removeObjectForKey:nextNumber];
}
}
}
if ([[myHashTable allKeys] count] == 0)
{
return TRUE;
}
else
{
return FALSE;
}
}
}
@end
Unit-Test-Code
NSMutableSet *testSet = [NSMutableSet new];
FactorHelper *fact1 = [[FactorHelper alloc] initWithFactors:[@[@(10),@(5),@(2)] mutableCopy]];
FactorHelper *fact2 = [[FactorHelper alloc] initWithFactors:[@[@(10),@(2),@(5)] mutableCopy]];
[testSet addObject:fact1];
[testSet addObject:fact2];
NSLog(@"Are factors 1 and 2 the same: %d",[fact1 isEqual:fact2]);
Wo in Ihrem Code verwenden Sie 'NSMutableSet'? – Willeke
Das testSet ist ein NSMutableSet. Hinzugefügt im Hauptcode oben. Der Code gehört zur Hauptmethode eines OS X-Befehlszeilentools. Siehe meine Antwort unten. Wenn Sie alle WAHR/FALSCH auf JA/NEIN setzen, wird das Problem behoben. –