0

我正在编写一个有 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 多种不同的对象类型,这会很粗糙,似乎必须有更好的方法。我讨厌硬编码值,喜欢通过对通过泛型类和方法运行的变量进行简单更新来简化我的代码。

4

3 回答 3

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];
于 2012-05-09T08:27:18.207 回答
0

如果您想这样做,那么您可以使用 Key-Value-Coding 从字符串中获取属性值。这篇文章中接受的答案显示了如何使用它(非常简单):Objective-C get a class property from string

对于您的任务,它看起来像这样:

int capacity = [[[sharedDataManager valueForKey:[NSString stringWithFormat:@"dictionaryLevel%@Data", level]] objectForKey:@"typeWarrior"] intValue];
于 2012-05-09T08:30:46.967 回答
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 作为他们的名字。

(请注意,我没有编译它,但它应该可以工作)

于 2012-05-09T08:34:02.227 回答