2011-01-27 3 views

ответ

76

Как NSDictionarys предназначены только для борьбы с объектами, простой способ сделать это, чтобы обернуть целое и поплавок в NSNumber объекта. Например:

NSMutableDictionary *testDictionary = [[NSMutableDictionary alloc] init]; 
[testDictionary setObject:[NSNumber numberWithFloat:1.23f] 
        forKey:[NSNumber numberWithInt:1]]; 
NSLog(@"Test dictionary: %@", testDictionary); 

[testDictionary release]; 

Чтобы извлечь соответствующее значение, просто используйте соответствующий intValue, floatValue и т.д. метод из класса NSNumber.

+0

Спасибо middaparka ... – Ratan

+2

Это говорит мне, что ключ должен быть «NSString *», а поиск через «NSKeyValueCoding.h» выглядит все методы ожидают строки. Что-то изменилось в SDK? –

2

Это должен быть объект, поэтому вместо этого используйте [NSNumber numberWithInt:myInteger].

Затем извлечь его с -integerValue

+1

Метод integerValue возвращает объект NSInteger, а не int. :-) –

+0

Ой, это должно быть -intValue. Спасибо middaparka – sidyll

+3

@middaparka: NSInteger не является объектом. – EmptyStack

8

Вы можете использовать NSMapTable, так как он поддерживает целые ключи и/или значения напрямую. Нет необходимости вставлять/распаковывать через NSNumber, но его также немного сложнее настроить и использовать.

+0

'NSMapTable' доступен только в iOS 6 и более поздних версиях. –

+1

NSMapTable содержит слабые ссылки, которые могут быть или не быть тем, что вы хотите. Тем не менее это отличается от NSDictionary. –

+0

'NSMapInsert' не доступен на iOS. Есть ли лучший способ установить целочисленное значение, отличное от следующего: '[map setObject: (__ bridge id) ((void *) myInt) forKey: myKey];'? Я предполагаю, что valueOptions были установлены в 'NSPointerFunctionsIntegerPersonality | NSPointerFunctionsOpaqueMemory'. – qix