NSDictionary With Integer Values
- You can only store objects, not primitives, within Cocoa collection classes, so to store numbers you need to use
NSNumber
objects. - You need to use an
NSMutableDictionary
if you wish to change the contents later. - Your call to
dictionaryWithObjectsAndKeys
has the keys and values reversed. - Your
stats
object is not being retained, so it will be released next time round the run loop (if you're using manual reference counting, that is).
You want:
stats = [[NSMutableDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:0], @"Attack",
[NSNumber numberWithInt:0], @"Defense",
[NSNumber numberWithInt:0], @"Special Attack",
[NSNumber numberWithInt:0], @"Special Defense",
[NSNumber numberWithInt:0], @"HP",
nil] retain];
In order to change the values you need to create a new NSNumber
object as they are immutable, so something like:
NSNumber *num = [stats objectForKey:@"Attack"];
NSNumber *newNum = [NSNumber numberWithInt:[num intValue] + (level * 5)];
[stats setObject:newNum forKey:@"Attack"];
All pretty tedious if you ask me; there must be an easier way, for example how about creating an Objective-C class to store and manipulate this stuff?
NSDictionary
s store NSObject*
s. In order to use them with integer values, you unfortunately need to use something like NSNumber
. So your initialization would look like:
-(id) init {
self = [super init];
if(self) {
stats = [NSDictionary dictionaryWithObjectsAndKeys:
@"Attack", [NSNumber numberWithInt:0],
@"Defense", [NSNumber numberWithInt:0],
@"Special Attack", [NSNumber numberWithInt:0],
@"Special Defense", [NSNumber numberWithInt:0],
@"HP", [NSNumber numberWithInt:0], nil];
}
return self;
}
Then you would have to retrieve them as numbers:
NSNumber *atk = [self.stats objectForKey:@"Attack"];
int iAtk = [atk intValue];
[self.stats setObject:[NSNumber numberWithInt:iAtk] forKey:@"Attack"];
EDIT
Of course, in order to do this, self.stats
needs to be an NSMutableDictionary
Adapting @trojanfoe's answer for modern Objective-C with nice syntax sugar:
stats = [@{@"Attack" : @0,
@"Defense" : @0,
@"Special Attack" : @0,
@"Special Defense" : @0,
@"HP" : @0} mutableCopy];
And to update a value:
stats[@"Attack"] = @([stats[@"Attack"] intValue] + (level * 5));