在NSArray中存储不同的数据类型

时间:2010-10-01 05:56:20

标签: objective-c nsarray nsdictionary

我正在尝试在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]; 

1 个答案:

答案 0 :(得分:3)

糟糕!你有各种各样的问题。

你需要回到绘图板并阅读一些内容。

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

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

  3. userDefaults = gameDict没有按照您的想法行事。 userDefaults是一个指针和一个局部变量。它没有分配用户默认值。你需要理解指针和C语言。

  4. 您收到的警告会告诉您问题所在。确保你理解它们。

  5. 我不明白你为什么要初始化字典和一些值,然后再尝试重新设置它们。在任何情况下,要对字典进行更改,它都需要是可变的,即NSMutableDictionary的实例。

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

  7. 应该看起来像:

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

    如果您的程序很快就会异常终止,那么您只需要同步调用,在您的情况下,根据我刚刚看到的情况判断,可能会。 ; - )