How can I use an integer value as 'key' to set value in NSMutableDictionary?
Asked Answered
B

3

45

How can I use an integer value as 'key' to set a float value in NSMutableDictionary ?

Bentinck answered 27/1, 2011 at 10:26 Comment(1)
As a potential aid to Google searchers: XCode will give the error Expected method to write array element not found on object of type 'NSMutableDictionary * on an attempt to use a raw int or an NSInteger as an NSMutableDictionary key.Forras
S
83

As NSDictionarys are only designed to deal with objects, a simple way to do this is to wrap the integer and float in a NSNumber object. For example:

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

[testDictionary release];

To extract the relevant value, simply use the appropriate intValue, floatValue, etc. method from the NSNumber class.

Selle answered 27/1, 2011 at 10:41 Comment(1)
It's telling me that the key must be NSString*, and searching through NSKeyValueCoding.h it looks like all the methods expect strings. Has something changed in the SDK?Wooton
F
8

You can use NSMapTable as it supports integer keys and/or values directly. No need to box/unbox through NSNumber, but it is also slightly more difficult to set up and use.

Fachanan answered 27/1, 2011 at 15:49 Comment(3)
NSMapTable is only available in iOS 6 and later.Rapier
NSMapTable holds weak references, which may or may not be what you want. That is different than NSDictionary, though.Well
NSMapInsert isn't available on iOS. Is there a better way to set an integer value other than something like this: [map setObject:(__bridge id)((void *)myInt) forKey:myKey];? I'm assuming the valueOptions were set to NSPointerFunctionsIntegerPersonality | NSPointerFunctionsOpaqueMemory.Orphrey
A
2

It needs to be an object, so use [NSNumber numberWithInt:myInteger] instead.

Then, retrieve it with -integerValue

Alkmaar answered 27/1, 2011 at 10:37 Comment(5)
The integerValue method returns an NSInteger object, not an int. :-)Selle
Ouch, that should be -intValue. Thanks middaparkaAlkmaar
@middaparka: NSInteger is not an object.Rhona
@Simon yes haha, but anyway I decided to point -intValue because I think the OP needs the primitive.Alkmaar
@Simon Ah.. yes. It's a foundation data type. My bad. (Feel free to ignore the above.) :-)Selle

© 2022 - 2024 — McMap. All rights reserved.