FactorHelper
정의가 아래에있는 Objective-C 클래스가 있습니다. 그것은 NSMutableArray
의 NSNumbers
인 요소라는 속성을 가지고 있습니다. 두 FactorHelper
개체의 factors 속성에 숫자가 다른 순서로있는 경우에도 true를 반환하는 사용자 지정 isEqual:
메서드가이 클래스에 있습니다. * [NSMutableSet addObject : X] * 이미 [Y isEqual : X] *가 이미 집합에있는 객체 Y에 대해 TRUE를 반환하더라도
FactorHelper
객체 하나를 생성하여 테스트했습니다. 그런 다음 NSMutableSet
을 만들고 firstObject를 추가 한 다음 두 번째 객체를 추가했습니다. 두 번째 개체가 추가되지 않을 것으로 예상했지만 추가 된 것을 볼 수 있습니다. 코드를 단계별로 실행하면 isEqual
이 addObject에 의해 호출되고 TRUE
을 반환한다는 것을 알게되었습니다. 내가 도대체 뭘 잘못하고있는 겁니까? [NSMutableSet new]
[NSMutableSet alloc] init]
에 변경는 UPDATE
예상대로 사물이 작동합니다.
또한 TRUE를 모두 변경하면 FALSE는 isEqual을 YES로 설정하고 NO를 설정하면 올바르게 동작합니다 ([NSMutableSet new]
으로 유지하더라도).
나는 무슨 일이 일어나는지 전혀 모른다. 누군가가 약간의 빛을 비춰 줄 수 있습니까?!
클래스 정의
@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
단위 테스트 코드
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]);
코드에서 NSMutableSet을 사용합니까? – Willeke
testSet은 NSMutableSet입니다. 위의 주 코드에 추가되었습니다. 이 코드는 OS X 커맨드 라인 툴의 주요 메소드 내에 있습니다. 아래 내 대답을 참조하십시오. 모든 TRUE/FALSE를 YES/NO로 변경하면 문제가 해결됩니다. –