1

私はObjectiveCを初めて使用し、2dint配列をNSMutableDictionaryに追加するのに問題があります。「互換性のないポインタタイプ」のコードエラー-これは、setObjectがオブジェクトを予期しているためだと思います。

コードは次のとおりです-レベルデータを含む辞書を作成しようとしています:

NSMutableDictionary *level = [[NSMutableDictionary alloc] init];

[level setObject:@"The Title" forKey:@"title"];
[level setObject:@"level_1" forKey:@"slug"];

int levelTiles[10][10] = {
    {1,1,1,1,1,1,1,1,1,1},
    {1,0,0,0,0,0,0,0,0,1},
    {1,0,0,0,0,0,0,0,0,1},
    {1,0,0,0,0,0,0,0,0,1},
    {1,0,0,0,0,0,0,0,0,1},
    {1,0,0,0,0,0,0,0,0,1},
    {1,0,0,0,0,0,0,0,0,1},
    {1,0,0,0,0,0,0,0,0,1},
    {1,0,0,0,0,0,0,0,0,1},
    {1,1,1,1,1,1,1,1,1,1}
};


[level setObject:levelTiles forKey:@"tiles"]; // THIS LINE FAILS

2つの質問があります:

  • このようにint配列(または同様のもの)を辞書に追加するにはどうすればよいですか?
  • ゲームのデータを初期化するためのより良い方法はありますか?

ご協力いただきありがとうございます、

ラクラン

4

1 に答える 1

1

Objective-C オブジェクトは NSDictionary/NSMutableDictionary にのみ追加できます。任意のポインターを追加することはできません。NSDictionary に追加する場合は、NSArray を使用する必要があります。

C 配列を直接取得/設定できないため、レベル オブジェクトに NSMutableDictionary を使用する代わりに、新しい「レベル」オブジェクトを作成し、アクセサーを使用してタイル配列を管理することができます。

@interface Level : NSObject 
{
    NSString* title;
    NSString* slug;
    int levelTiles[10][10];  
}
- (id)initWithTitle:(NSString*)aTitle slug:(NSString*)aSlug tiles:(int[10][10])tiles;
- (int)valueOfTileAtI:(int)i j:(int)j;
- (int)setI:(int)i j:(int)j to:(int)v;
@end

@implementation Level
- (id)initWithTitle:(NSString*)aTitle slug:(NSString*)aSlug tiles:(int[10][10])tiles 
{
    self=[super init];
    if(self)
    {
        title = [aTitle copy];
        slug = [aSlug copy];
        for (int i=0; i<10; i++) 
        {
            for (int j=0; j<10; j++) 
            {
                levelTiles[i][j] = levelTiles[i][j];
            }
        }
    }
    return self;
}

- (int)valueOfTileAtI:(int)i j:(int)j 
{
    return levelTiles[i][j];
}

- (void)setTileAtI:(int)j j:(int)j toValue:(int)v 
{
    levelTiles[i][j] = v;
}

-(void)dealloc
{
    [title release];
    [slug release];
    [super dealloc];
}

@end

次に、これを行うことができます:

int tiles[10][10] = {
        {1,1,1,1,1,1,1,1,1,1},
        {1,0,0,0,0,0,0,0,0,1},
        {1,0,0,0,0,0,0,0,0,1},
        {1,0,0,0,0,0,0,0,0,1},
        {1,0,0,0,0,0,0,0,0,1},
        {1,0,0,0,0,0,0,0,0,1},
        {1,0,0,0,0,0,0,0,0,1},
        {1,0,0,0,0,0,0,0,0,1},
        {1,0,0,0,0,0,0,0,0,1},
        {1,1,1,1,1,1,1,1,1,1}
};
Level* myLevel = [[Level alloc] initWithTitle:@"The Title" slug:@"level_1" tiles:tiles];
于 2009-09-05T04:33:57.187 に答える