Хранение разных типов данных в NSArray - PullRequest
0 голосов
/ 01 октября 2010

Я пытаюсь сохранить разные типы данных в 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 Ответ

3 голосов
/ 01 октября 2010

Хлоп!У вас есть все виды проблем.

Вы должны вернуться к чертежной доске и прочитать некоторые вещи.

  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"];
…

И вызов синхронизации требуется только в том случае, если ваша программа вскоре ненормально завершит работу, что в вашемДело, судя по тому, что я только что видел, наверное, будет.; -)

...