我正在尝试在NSDictionary中存储不同的数据类型,以便在游戏终止时保存在NSUserdefaults中。我正在尝试存储一个字符,3个浮点数和一个字符串,我不断收到关于字符和浮点数的警告,我似乎无法在任何地方找到答案。 1)我甚至需要设置阵列吗? 2)如何将不同的数据类型存储到像数组或字典这样的对象?代码看起来像这样:
gameKeys = [[NSArray alloc] initWithObjects:@"gameScore",@"gameSound",@"gameDifficulty",@"theGameLoopSpeed",@"theDelayGameSpeed",nil];
gameValues = [[NSMutableArray alloc] init];
[gameValues setValue:score forKey:@"gameScore"];
[gameValues addObject:[NSString stringWithFormat:score]];// unsigned char
[gameValues addObject:[NSString stringWithFormat:sound]];//string
[gameValues addObject:[NSString stringWithFormat:gameDifficulty]];// char
[gameValues addObject:[NSNumber numberWithFloat:gameLoopSpeed]];// float
[gameValues addObject:[NSNumber numberWithFloat:delayGameLoopSpeed]];//float
NSDictionary *gameDict = [[NSDictionary alloc] initWithObjects:gameKeys forKeys:gameValues];
[gameDict setObject:[NSString stringWithFormat:score] forKey:@"gameScore"];//unsigned char
[gameDict setObject:[NSString stringWithFormat:sound] forKey:@"gameSound"];//string
[gameDict setObject:[NSString stringWithFormat:gameDifficulty] forKey:@"theGameDifficulty"];//char
[gameDict setObject:[NSNumber numberWithFloat:gameLoopSpeed] forKey:@"theGameLoopSpeed"];//float
[gameDict setObject:[NSNumber numberWithFloat:delayGameLoopSpeed] forKey:@"theDelayGameLoopSpeed"];//float
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
userDefaults = gameDict;
[userDefaults synchronize];
答案 0 :(得分:3)
糟糕!你有各种各样的问题。
你需要回到绘图板并阅读一些内容。
如果使用stringWithFormat,则必须传入格式字符串,该字符串几乎总是字符串文字。如果您作为参数传递的变量包含百分比字符,则程序将崩溃。
char是整数类型,因此您应将其存储为NSNumber,或使用便捷方法: - [NSUserDefaults setInteger:forKey:]。
userDefaults = gameDict没有按照您的想法行事。 userDefaults是一个指针和一个局部变量。它没有分配用户默认值。你需要理解指针和C语言。
您收到的警告会告诉您问题所在。确保你理解它们。
我不明白你为什么要初始化字典和一些值,然后再尝试重新设置它们。在任何情况下,要对字典进行更改,它都需要是可变的,即NSMutableDictionary的实例。
应该是“gameLoopSpeed”而不是“theGameLoopSpeed”。
它应该看起来像:
NSUserDefaults *dflts = [NSUserDefaults standardUserDefaults];
[dflts setInteger:score forKey:@"gameScore"];
[dflts setObject:sound forKey:@"gameSound"];
[dflts setFloat:gameLoopSpeed forKey:@"gameLoopSpeed"];
…
如果您的程序很快就会异常终止,那么您只需要同步调用,在您的情况下,根据我刚刚看到的情况判断,可能会。 ; - )