5

Objective-C の NSMutableSet についていくつか問題があります。NSSet が 2 つのオブジェクトのハッシュ コードを比較して、同一かどうかを判断することを学びました。問題は、自分のサブクラスであるクラスを実装したNSObjectことです。NSString *nameそのクラスにはプロパティがあります。私がしたいのは、このカスタム クラスのインスタンスが "name" という同じ変数値を持っている場合、それらは同一である必要があり、NSMutableSet に追加するときにそのような同一のクラスを複製してはならないということです。

したがって、- (NSUInteger)hash関数をオーバーライドすると、2 つのインスタンスに対して同じハッシュが返されることがデバッグで示されますobj1, obj2 (obj1.name == obj2.name)。しかし、obj1、obj2 を an に追加するNSMutableSetと、NSMutableSetまだ obj1、obj2 の両方が含まれていました。

NSString同じ値を持つ2 つを試し、それらを に追加するとNSMutableSet、セットは 1 つだけになりますNSString

解決策は何ですか?助けてくれてありがとう!

カスタム クラス: Object.h:

#import <Foundation/Foundation.h>

@interface Object : NSObject

@property (retain) NSString *name;

@end

Object.m

@implementation Object
@synthesize name;

-(BOOL)isEqualTo:(id)obj {
    return [self.name isEqualToString:[(Object *)obj name]] ? true : false;
}

- (NSUInteger)hash {
    return [[self name] hash];

}
@end

そしてメイン:

#import <Foundation/Foundation.h>
#import "Object.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        Object *obj1 = [[Object alloc]init];
        Object *obj2 = [[Object alloc]init];
        obj1.name = @"test";
        obj2.name = @"test";
        NSMutableSet *set = [[NSMutableSet alloc] initWithObjects:obj1, obj2, nil];
        NSLog(@"%d", [obj1 isEqualTo:obj2]);
        NSLog(@"%ld", [set count]);
    }
    return 0;
}
4

1 に答える 1

8

実装する代わりに、実装isEqualTo:する必要がありますisEqual:

- (BOOL)isEqual:(id)object {
    return [object isKindOfClass:[MyObject class]] &&
           [self.name isEqual:[(MyObject *)object name]];
}

NOとの両方がself.nameである場合、これは (おそらく誤って) を返します。両方のプロパティがある場合に返したい場合は、使用する必要がありますobject.namenilYESnil

- (BOOL)isEqual:(id)object {
    if ([object isKindOfClass:[MyObject class]]) {
        return (!self.name && ![(MyObject *)object name]) ||
        [self.name isEqual:[(MyObject *)object name]];
    }
    return NO;
}
于 2013-10-25T02:38:33.383 に答える