我正在编写一个有40个级别的游戏,并且我将所有级别数据存储在.plist中。这很好但现在我正在尝试实现多个级别,我正在寻找一种方法来基于级别调用单例上的属性而无需手动编写像switch / case这样的东西。我想做类似以下的事情:
这是我用来提取数据的代码,但正如您所看到的,我已经对“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多个不同的对象类型,这将是粗糙的,似乎必须有更好的方法。我讨厌硬编码值,喜欢通过简单更新通过泛型类和方法运行的变量来简化我的代码。
答案 0 :(得分:1)
你为什么不这样做;
使用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];
答案 1 :(得分:0)
如果你想这样做,那么你可以使用Key-Value-Coding从字符串中获取属性值。这篇文章中接受的答案显示了如何使用它(非常简单):Objective-C get a class property from string
对于你的任务,它看起来像这样:
int capacity = [[[sharedDataManager valueForKey:[NSString stringWithFormat:@"dictionaryLevel%@Data", level]] objectForKey:@"typeWarrior"] intValue];
答案 2 :(得分:0)
您可以使用:
NSString level = @"dictionaryLevel1Data"
SEL methodSelector = NSSelectorFromString(level);
if ([sharedDataManager conformsToSelector:@selector(methodSelector)]) {
NSDictionary *levelData = [sharedDataManager performSelector:methodSelector];
// Do whatever you need here
}
我假设所有的dictionaryLevelData都是合成的并且有getter作为他们的名字。
(注意我没有编译它但它应该工作)