我有这个:
@implementation BoardModel
{
NSUInteger _board[5][5];
}
我可以在BoardModel.m文件中设置和获取其信息,但我需要在GameViewController.m文件中访问该信息。这就是我的尝试:
@property (nonatomic) NSUInteger board[5][5];
我收到错误消息:'属性不能包含数组或函数类型NSUInteger * [5] [5]。'
所以,我肯定需要从BoardModel.m文件中访问该信息,我想在我的GameViewController.m文件中没有setter函数的情况下这样做。
答案 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