22

私はモンスターとのゲームに取り組んでいます。それぞれに、すべて int になる統計のリストがあります。各統計を独自の変数として設定できますが、それらはすべて関連しているため、NSDictionary に保持することをお勧めします。各統計の値を変更しようとすると、問題が発生します。

私が持っているもの:

-(id) init {
    self = [super init];
    if(self) {
        stats = [NSDictionary dictionaryWithObjectsAndKeys:
              @"Attack",  0,
              @"Defense", 0,
              @"Special Attack", 0,
              @"Special Defense", 0,
              @"HP", 0, nil];
    }
    return self;
}

私がしたいこと

-(void) levelUp {
    self.level++;
    [self.stats objectForKey:@"Attack"] += (level * 5);
    [self.stats objectForKey:@"Defense"] += (level * 5);
    [self.stats objectForKey:@"Special Attack"] += (level * 5);
    [self.stats objectForKey:@"Special Defense"] += (level * 5);
    [self.stats objectForKey:@"HP"] += (level * 5);
}

取得しているエラー

Arithmetic on pointer to interface 'id', which is not a constant size in non-fragile ABI

したがって、私が問題を抱えている理由は、整数ではなく objectForKey から返されたオブジェクトを取得しているためであることは明らかです。そのため、取得しているオブジェクトで intValue メソッドを実行しようとしましたが、別のエラーが発生しました。具体的には次のとおりです。

Assigning to 'readonly' return result of an objective-c message not allowed

これを修正する方法についてのアイデアがありません。何か助けはありますか?それらをすべてまとめて格納するという考えをあきらめて、各統計に int プロパティを使用するだけの方がよいでしょうか?

4

3 に答える 3

64
  1. Cocoa コレクション クラス内にはプリミティブではなくオブジェクトのみを格納できるため、数値を格納するにはNSNumberオブジェクトを使用する必要があります。
  2. NSMutableDictionary後で内容を変更する場合は、を使用する必要があります。
  3. への呼び出しでdictionaryWithObjectsAndKeysは、キーと値が逆になっています。
  4. オブジェクトstatsは保持されていないため、次回の実行ループで解放されます (手動参照カウントを使用している場合)。

あなたがしたい:

stats = [[NSMutableDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithInt:0], @"Attack",
    [NSNumber numberWithInt:0], @"Defense",
    [NSNumber numberWithInt:0], @"Special Attack",
    [NSNumber numberWithInt:0], @"Special Defense",
    [NSNumber numberWithInt:0], @"HP",
    nil] retain];

NSNumber値を変更するには、不変であるため、新しいオブジェクトを作成する必要があるため、次のようになります。

NSNumber *num = [stats objectForKey:@"Attack"];
NSNumber *newNum = [NSNumber numberWithInt:[num intValue] + (level * 5)];
[stats setObject:newNum forKey:@"Attack"];

あなたが私に尋ねると、すべてかなり退屈です。もっと簡単な方法があるはずです。たとえば、Objective-C クラスを作成して、このようなものを保存および操作するのはどうですか?

于 2012-07-05T21:10:39.493 に答える
7

NSDictionaryの店NSObject*S. それらを整数値で使用するには、残念ながら のようなものを使用する必要がありますNSNumber。したがって、初期化は次のようになります。

-(id) init {
    self = [super init];
    if(self) {
        stats = [NSDictionary dictionaryWithObjectsAndKeys:
              @"Attack",  [NSNumber numberWithInt:0],
              @"Defense", [NSNumber numberWithInt:0],
              @"Special Attack", [NSNumber numberWithInt:0],
              @"Special Defense", [NSNumber numberWithInt:0],
              @"HP", [NSNumber numberWithInt:0], nil];
    }
    return self;
}

次に、それらを数値として取得する必要があります。

NSNumber *atk = [self.stats objectForKey:@"Attack"];
int iAtk = [atk intValue];
[self.stats setObject:[NSNumber numberWithInt:iAtk] forKey:@"Attack"];

編集

もちろん、これを行うにはself.statsNSMutableDictionary

于 2012-07-05T21:03:05.543 に答える