辞書のキーとしてインスタンスを使用しているカスタム クラスがあります。nil
問題は、キーが実際にディクショナリにあるときに、カスタム インスタンス キーの 1 つを使用してディクショナリから値を要求することがある (常にではありません) ことです。カスタムオブジェクトを辞書キーとして使用する方法についてWebを見回しましたが、見つけたのは、NSCopying
プロトコルを実装する必要があるということだけです。
私のクラスは次のようになります。
// .h
@interface MyObject: NSObject <NSCopying>
@property (copy) NSString* someString;
@property (copy) NSString* otherString;
@property int someInt;
+ (instancetype) objectWithString:(NSString*)str;
- (id) copyWithZone:(NSZone*)zone;
@end
// .m
@implementation MyObject
@synthesize someString;
@synthesize otherString;
@synthesize someInt;
+ (instancetype) objectWithString:(NSString*)str {
id obj = [[self alloc] init];
[obj setSomeString:str];
[obj setOtherString:[str lowercaseString];
[obj setSomeInt:0];
return obj;
}
- (id) copyWithZone:(NSZone*)zone {
id other = [[[self class] allocWithZone:zone] init];
[other setSomeString:self.someString];
[other setOtherString:self.otherString];
[other setSomeInt:self.someInt];
return other;
}
@end
次に、これらのいくつかを次のような変更可能な辞書に入れます。
MyObject* key1 = [MyObject objectWithString:@"Foo"];
MyObject* key2 = [MyObject objectWithString:@"Bar"];
NSNumber* value1 = [NSNumber numberWithInt:123];
NSNumber* value2 = [NSNumber numberWithInt:456];
NSMutableDictionary* theDict = [[NSMutableDictionary alloc] init];
[theDict setObject:value1 forKey:key1];
[theDict setObject:value2 forKey:key2];
今私がやりたいことは、辞書からキーと値のペアをポップすることです。そのため、次のようにします。
MyObject* theKey = [[theDict allKeys] firstObject];
NSNumber* theValue = [theDict objectForKey:theKey];
そして、ここで私は問題に遭遇します。 ほとんどの場合、これで問題なく動作します。ただし、 をobjectForKey:theKey
返すこともありますnil
。コードにブレークポイントを設定しましたが、theKey
実際にtheDict
.
ここで何が間違っていますか?