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;
}