4

辞書のキーとしてインスタンスを使用しているカスタム クラスがあります。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.

ここで何が間違っていますか?

4

1 に答える 1