objective-c setter 2d-array

时间:2009-03-10 00:34:31

标签: objective-c arrays

我想初始化一个二维数组..但我的代码不起作用,

有人可以告诉我出了什么问题吗?

由于 克里斯

@interface Map : NSObject {
    int mapData[8][8];  
}
@property(readwrite) int** mapData;
@end


@implementation Map
@synthesize **mapData; (Error: Syntax before *)

- (id)initWithMap:(int[8][8])map {

    for (int i=0; i<8; i++) {
        for (int j=0; j<8; j++) {
            self.mapData[i][j] = map[i][j];
        }
    }
    return self;
}

@end

(Warning mapData requires method... use @synthesize or.......)

编辑:如果我按照建议删除了合成类型,编译器会告诉我另一个错误:属性mapData的错误类型与ivar mapData的类型不匹配

编辑#2:有人可以发布更正后的代码吗?我正在处理这个非常愚蠢的问题超过一个小时..(没有c / c ++背景,但是java)

3 个答案:

答案 0 :(得分:4)

int mapData[8][8];

int **mapData;

的解释不同。第一个是一个包含64个连续int的数组,另一个是指向int的指针。

也许这对您有用,将2d数组包装在结构中......

struct map_s {
  int map[8][8];
};
typedef struct map_s map_t;

@interface Map : NSObject {
  map_t mapData;
}
@property (nonatomic, readwrite) map_t mapData;
@end


@implementation Map
@synthesize mapData;

- (id)initWithMap:(map_t)map {
  int i, j;
  for (i=0; i<8; i++) {
    for (j=0; j<8; j++) {
      self.mapData.map[i][j] = map.map[i][j];
    }
  }
  return self;
}

@end

重写一下以显示地图初始化程序

struct map_s {
  int map[8][8];
};
typedef struct map_s map_t;

@interface Map : NSObject {
  map_t mapData;
}
@property (nonatomic, readwrite) map_t mapData;
- (void)init;
- (id)initWithMap:(map_t)map;
@end


@implementation Map
@synthesize mapData;

- (void)init
{
  map_t first = {
    {
      { 0,0,0,0,0,0,0,0 },
      { 0,0,0,0,0,0,0,0 },
      { 0,0,0,0,0,0,0,0 },
      { 0,0,0,0,0,0,0,0 },
      { 0,0,0,0,0,0,0,0 },
      { 0,0,0,0,0,0,0,0 },
      { 0,0,0,0,0,0,0,0 },
      { 0,0,0,0,0,0,0,0 }
    }
  };
  [self initWithMap:first];
}

- (id)initWithMap:(map_t)map {
  mapData = map;
  return self;
}

@end

答案 1 :(得分:2)

我认为你不能拥有数组类型的属性。你可以只使用一个吸气剂/设定器吗?例如:

@interface Map : NSObject {
    int mapData[8][8];  
}
- (int)getI:(int)i j:(int)j;
- (int)setI:(int)i j:(int)j to:(int)v;
@end


@implementation Map

- (id)initWithMap:(int[8][8])map {

    for (int i=0; i<8; i++) {
        for (int j=0; j<8; j++) {
            mapData[i][j] = map[i][j];
        }
    }
    return self;
}

- (int)getI:(int)i j:(int)j {
    return mapData[i][j];
}

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

@end

答案 2 :(得分:0)

属性的synthesize语句不需要指定类型,只需要指定名称。

因此;

@synthesize mapData;

另外因为mapData是一个实例变量,所以不需要使用“self.mapData”语法。你可以做;

mapData[i][j] = map[i][j];

最后,要意识到这些只是数据块,因此您可以一次性复制所有内容。 E.g

// could also be sizeof(mapData) but this is more instructive
memcpy(mapData, map, sizeof(int) * 8 * 8);