如何创建公共NSUInteger 2d-array属性

时间:2016-04-15 23:49:31

标签: objective-c arrays

我有这个:

    @implementation BoardModel
    {
        NSUInteger _board[5][5];
    }

我可以在BoardModel.m文件中设置和获取其信息,但我需要在GameViewController.m文件中访问该信息。这就是我的尝试:

    @property (nonatomic) NSUInteger board[5][5];

我收到错误消息:'属性不能包含数组或函数类型NSUInteger * [5] [5]。'

所以,我肯定需要从BoardModel.m文件中访问该信息,我想在我的GameViewController.m文件中没有setter函数的情况下这样做。

2 个答案:

答案 0 :(得分:0)

您正在尝试将C数组与Objective-C类混合,这在某种程度上起作用,但不包括能够将它们用作属性。您有多种不同的问题解决方案,其中一些是:

  • NSArray一起使用NSNumber并执行所有Objective-C样式
  • 将数组包装在struct内,以便您可以通过struct正确访问该字段。

类似的东西:

typedef struct
{
  NSUInteger data[5][5];
} board;

@interface MyClass : NSObject
{
  board _board;
}

@property(readonly,nonatomic) board* board;

@end

@implementation MyClass

-(board*) board
{
  return &_board;
}

@end

然后,您需要通过struct来访问数据,例如:object.board->data[i][j]

答案 1 :(得分:0)

Objective-C中的属性不能具有C数组类型,因为C数组不能通过值传递,例如你不能写一个C函数,它将一个数组作为参数,或者将一个数组分配给另一个数组。

您可以通过地址(或指针)将C数组传递给函数,即传递的值是数组的地址,函数可以访问原始数据数组通过该指针。必须注意,传递地址的数组至少与可能使用的地址一样长。

如果需要按值传递数组,C中有一个标准技巧:在C结构中是值类型,结构可以包含数组类型的字段,因此要按值传递数组,只需创建一个字段结构...

但是,根据您的意见,您希望您的财产可以直接访问以阅读和修改原始数组,因此您需要通过地址传递。

为了简化操作,请定义一些类型以及属性:

@interface BoardModel : NSObject

typedef NSUInteger Board[5][5]; // Give the array a name
typedef Board *BoardPtr;        // A pointer to a Board

@property (readonly) BoardPtr board; // Property return a pointer

@end

数组和属性的定义很简单:

@implementation BoardModel
{
   Board _board;
}

- (BoardRef) board { return &_board; }

现在从其他地方你可以创建一个BoardModel并获得指向其数组的指针:

BoardModel *boardModel = [BoardModel new];
BoardPtr theBoard = boardModel.board;

然后访问数组的元素,你必须通过theBoard和索引间接访问,例如

... (*theBoard)[i][j] ...

这样的表达式直接(并且有效地)访问数组。

重要提示: theBoard中存储的值仅在BoardModel引用的boardModel对象存在时才有效 - 它是指向对象的直接指针。作为指向对象内部的指针,可以使对象保持活动状态。

HTH