Как динамически изменить свойство, к которому осуществляется доступ

Я программирую игру с 40 уровнями и храню все данные об уровне в .plist. Это прекрасно работает, но теперь, когда я пытаюсь реализовать несколько уровней, я ищу способ вызвать свойство в синглтоне на основе уровня без ручного кодирования чего-то вроде переключателя/кейса. Я хотел бы сделать что-то вроде следующего:

Это код, который я использую для извлечения своих данных, но, как видите, я жестко запрограммировал свойство «dictionaryLevel1Data».

int capacity = [[sharedDataManager.dictionaryLevel1Data objectForKey:@"typeWarrior"] intValue];

Я хотел бы установить переменную и вызвать свойство синглтона, основанное на том, что, как я знаю, не работает. Обратите внимание, как я заменяю «dictionaryLevel1Data»

NSString level = @"1";

int capacity = [[sharedDataManager.[NSString stringWithFormat:@"dictionaryLevel%@Data", level] objectForKey:@"typeWarrior"] intValue];

Буду очень признателен за любые предложения о том, как я могу это сделать. Я всегда могу пойти и вручную настроить переключатель/кейс для каждого уровня, но с 40 уровнями и 50+ различными типами объектов на уровне это было бы грубо, кажется, должен быть лучший способ. Я ненавижу жесткие кодовые значения и люблю упрощать свой код с помощью простых обновлений переменных, которые выполняются через общие классы и методы.


person XBXSlagHeap    schedule 09.05.2012    source источник


Ответы (3)


Если вы хотите сделать это таким образом, вы можете использовать Key-Value-Coding, чтобы получить значение свойства из строки. Принятый ответ в этом посте показывает, как его использовать (очень просто): Objective-C получить свойство класса из строки

Для вашей задачи это будет выглядеть примерно так:

int capacity = [[[sharedDataManager valueForKey:[NSString stringWithFormat:@"dictionaryLevel%@Data", level]] objectForKey:@"typeWarrior"] intValue];
person Johannes Lumpe    schedule 09.05.2012
comment
Спасибо, Йоханнес! ЭТО ИМЕННО то, что я искал! Спасибо, что также связали другой пост, так как это привело меня к ответу на другие вопросы, которые у меня были. Ваше здоровье! :0) - person XBXSlagHeap; 09.05.2012
comment
Пожалуйста, рад, что это также может решить вторую проблему! - person Johannes Lumpe; 09.05.2012

почему бы вам не сделать так;

использовать карту данных уровня 2;

//sharedDataManager.levelData is a NSDictionary that contains lots of NSDictionarys
NSDictionary *levelData = [sharedDataManager.levelData objectForKey:[NSString stringWithFormat:@"dictionaryLevel%@Data", level]];

int capacity = [levelData objectForKey:@"typeWarrior"] intValue];
person adali    schedule 09.05.2012
comment
Спасибо... это был мой запасной вариант. Мне просто очень нравится предложение Йоханнеса. Успокойся и еще раз спасибо за такой быстрый ответ! - person XBXSlagHeap; 09.05.2012

Ты можешь использовать :

NSString level = @"dictionaryLevel1Data"
SEL methodSelector = NSSelectorFromString(level);
if ([sharedDataManager conformsToSelector:@selector(methodSelector)]) {
    NSDictionary *levelData = [sharedDataManager performSelector:methodSelector];
    // Do whatever you need here
}

Я предполагаю, что все DictionLevelData синтезированы и имеют геттеры в качестве имени.

(Обратите внимание, что я его не компилировал, но он должен работать)

person giorashc    schedule 09.05.2012
comment
Спасибо за ответ. Это тоже могло бы сработать... точно так же, как valueForKey, которое я никогда раньше не видел в предложении Йоханнеса. Спасибо еще раз. - person XBXSlagHeap; 09.05.2012