2012-02-12 3 views
8

Я пытаюсь получить доступ к моему объекту словаря. Вот мой код:Использование int в качестве ключа NSDictionary?

int tag = object.tag; 
CGPoint point = [[self.dict objectForKey:tag] CGPointValue]; 

Проблема заключается в том, что объектForKey должен взять объект Objective-C, а не int. Я попробовал обернуть тег в NSNumber с [NSNumber numberWithInt:tag] и передать его в objectForKey:, но он возвращает нулевой объект.

Любые идеи? Спасибо

+3

Как вы положили предметы в 'self.dict' в первое место? – mattjgalloway

+0

initWithObjectsAndKeys: [NSValue valueWithCGPoint: CGPointMake (1,2)], @ "100" и т. Д. Обратите внимание, что мой словарь в порядке, я обращаюсь к нему в других частях моего кода с помощью in-in (для ключа id в self.dict). Однако в этом случае я не хочу использовать цикл. Спасибо – user339946

ответ

13

Если вы используете цифры как строки для словарных клавиш, вы должны повернуть int в NSString или NSNumber, чтобы использовать его в качестве словарного ключа. Вот как это сделать для строки:

NSString *key = [NSString stringWithFormat:@"%d", myInteger]; 

Как @Hughes BR упоминает в комментариях, требование ключевого объекта является то, что он должен соответствовать протоколу NSCopying.

+0

Привет, я вручную установил свой объект.tag равным 100, 101 и т. Д. Клавиши слова записываются как @ "101". Обратите внимание, что я успешно пользовался словарем в других частях моего кода, особенно когда я использовал цикл for-in. Мои словарные объекты и ключи - все есть. – user339946

+15

Вам не нужно использовать строку. «NSNumber» будет достаточным и потенциально более естественным. '[NSNumber numberWithInteger: [object tag]]' будет делать трюк. –

+0

@SedateAlien Это правда; если все ключи являются ints, то NSNumber лучше, потому что это более конкретный тип данных. Тогда любая попытка создать NSNumber из неправильного типа данных позволит легко найти проблему. – bneely

5

Я использую NSNumbers без проблем, но должен избегать обычных методов setObject: forKey: или setValue: forKey:. Это создаст предупреждение.

Нет предупреждения, однако, создается (и код работает как намеченная) с

NSMutableDictionary *myDict = [[NSMutableDictionary alloc] init]; 
NSNumber *key = @1; 
id *myObject = [your code here]; 
myDict[key] = myObject; 

Retrieval проста:

myObject = myDict[key]; 
Смежные вопросы