2010-10-01 41 views
0

我试图在NSDictionary中存储不同的数据类型,以在游戏终止时保存在NSUserdefaults中。我试图存储一个字符,3个浮点数和一个字符串,我不断收到关于字符和浮点数的警告,我似乎无法在任何地方找到答案。 1)我甚至需要安装阵列? 2)如何将不同的数据类型存储到像数组或字典这样的对象中?该代码看起来像这样:在NSArray中存储不同的数据类型

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

警告说什么? – 2010-10-01 06:10:52

+0

@Robot K:我的猜测是它说“非常量格式字符串”。 – JeremyP 2010-10-01 09:01:34

+0

只是。哇!我还没有看到那么多的真实世界代码的编程错误。这段代码应该会在第4行崩溃,因为gameValues是一个“NSMutableArray”,因此它不会响应KVC选择器。 (毕竟,首先应该有一个编号列表中的“gameScore”元素是什么?) – danyowdee 2010-10-01 09:37:50

回答

3

Yikes!你有各种各样的问题。

你需要回到绘图板并阅读一些东西。

  1. 如果使用stringWithFormat,则必须传入格式字符串,该格式字符串几乎总是字符串文字。如果作为参数传递的变量包含百分号字符,则程序将崩溃。

  2. char是一个整数类型,因此您应该将其存储为NSNumber,或者使用便捷方法: - [NSUserDefaults setInteger:forKey:]。

  3. userDefaults = gameDict没有做你认为的事情。 userDefaults是一个指针和一个局部变量。它不分配用户默认值。你需要了解指针和C语言。

  4. 您收到的警告将告诉您问题是什么。确保你了解他们。

  5. 我不明白你为什么要初始化字典和一些值,然后尝试再次设置它们。无论如何,要对字典进行更改,它需要是可变的,即NSMutableDictionary的一个实例。

  6. 它应该是“gameLoopSpeed”而不是“theGameLoopSpeed”。

应该看起来像:

NSUserDefaults *dflts = [NSUserDefaults standardUserDefaults]; 

[dflts setInteger:score forKey:@"gameScore"]; 
[dflts setObject:sound forKey:@"gameSound"]; 
[dflts setFloat:gameLoopSpeed forKey:@"gameLoopSpeed"]; 
… 

而你只需要同步调用,如果你的程序将异常后很快终止,而你的情况,从我”判断刚看过,可能会。 ;-)

+0

O谢谢你们,我是新来的客观C,试图抓住它。 – user464176 2010-10-01 19:19:17

相关问题