结构包含目标C中的结构数组

时间:2013-05-17 07:15:05

标签: objective-c struct typedef

我有一个tile的结构(所有属性都是以前定义的枚举)

typedef struct {
    ShapeType shape;
    ColorType color;
    PatternType pattern;
    IconType icon;
} TileDefinition;

我想创建另一个包含16个tile的结构,用于“board”。像这样:

typedef struct {
    TileDefinition[16]

} BoardDefinition;

然后我希望能够像这样循环:

for(int i=0;i<16;i++) {
    TileDefinition tileDef = boardDef[i];
    // Do something with tileDef
}

但显然BoardDefinition结构的设置不​​起作用。我怎么设置它?我应该在哪里使用指针?

由于

3 个答案:

答案 0 :(得分:1)

这实际上是一个C问题。

这一点很好:

typedef struct {
    ShapeType shape;
    ColorType color;
    PatternType pattern;
    IconType icon;
} TileDefinition;

在这里,您需要将BoardDefinition声明为:

enum { BoardDefinition_NTiles = 16 }; // << declare a constant for your ease of use
typedef struct {
    TileDefinition tile[BoardDefinition_NTiles];
} BoardDefinition;

然后循环遍历它们:

// Given:
BoardDefinition boardDef;

for (size_t i = 0; i < BoardDefinition_NTiles; i++) {
    TileDefinition* const tile = &boardDef.tile[i]; // << get a reference to a tile
    // member access of the referenced tile:
    tile->color.red = 1;
}

您编写的版本会创建磁贴的副本:

for (size_t i = 0; i < BoardDefinition_NTiles; i++) {
    TileDefinition tile = boardDef.tile[i]; // << creates a copy of the tile, local to the loop body
    // member access of the copied tile:
    tile.color.red = 1;
}

答案 1 :(得分:0)

选项1:使BoardDefinition成为Objective-C对象,可以在init方法中设置它。

选项2:使用(Objective-)C ++并为struct BoardDefinition提供构造函数。

选项3:与C保持并提供initBoardDefinition(BoardDefinition *boardDef);功能。

答案 2 :(得分:0)

正如trojanfoe建议的那样,这些会更好地作为Objective-C对象,但如果由于某种原因你不会这样做。 您可能想要在某个类中声明BoardDefinition类型的实例变量,例如

@interface MyClass : NSObject
{
    BoardDefinition    definition;
}

你BoardDefinition也错了它应该像

typedef struct {
    TileDefinition      boardDef[16];

} BoardDefinition;

你的循环就像是

for(int i=0;i<16;i++) {
    TileDefinition tileDef = definition.boardDef[i];
    // Do something with tileDef
}

您不需要在父结构中使用TileDefinition的指针,如

typedef struct {
    TileDefinition    * tileDefinition;
    NSUInteger        count;
} BoardDefinition;

通过这种方式,您可以拥有可变数量的TileDefinition。在这种情况下,您必须对类的初始化方法执行类似于以下操作的tileDefinition。

- (id)init
{
    if( (self = [super init]) != nil )
    {
        definition.count = 16;
        definition.tileDefinition = malloc( definition.count * sizeof(*definition.tileDefinition);
    }
    return self;
}