2010-10-01 2 views
0

Я пытаюсь хранить различные типы данных в NSDictionary для сохранения в NSUserdefaults, когда игра заканчивается. Я пытаюсь сохранить char, 3 float и строку, я продолжаю получать предупреждение о char и поплавках, и я не могу найти ответ нигде. 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

Что предупреждает? –

+0

@Robot K: Я думаю, это говорит что-то вроде строки «non constant format». – JeremyP

+0

Просто. Вау! Я еще не видел так много ошибок программирования в стольких строках реального мира. Этот фрагмент должен произойти сбой в строке 4, потому что gameValues ​​- это 'NSMutableArray', который, как таковой, не отвечает на KVC-селектора. (В конце концов, что такое «gameScore» -й элемент нумерованного списка, который должен быть в первую очередь?) – danyowdee

ответ

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

Смежные вопросы