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

あなたが使用することができます:

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

すべてのdictionaryLevelDataが合成され、名前にゲッターがあると思います。

(私はそれをコンパイルしなかったが、それは動作するはずであることに注意してください)

于 2012-05-09T08:34:02.227 に答える
0

このようにしたい場合は、Key-Value-Codingを使用して、文字列からプロパティ値を取得できます。この投稿で受け入れられた答えは、それを使用する方法を示しています(非常に簡単です):Objective-Cは文字列からクラスプロパティを取得します

あなたのタスクでは、次のようになります。

int capacity = [[[sharedDataManager valueForKey:[NSString stringWithFormat:@"dictionaryLevel%@Data", level]] objectForKey:@"typeWarrior"] intValue];
于 2012-05-09T08:30:46.967 に答える