我有一个c-struct数组,想要定义一个属性。 这是相关代码..
struct Vertex {
float x, y, z;
float nx, ny, nz;
float u, v;
};
@interface Mesh : NSObject{
Vertex m_vertices[MaxVertices];
}
@property (nonatomic) Vertex m_vertices[MaxVertices];
@end
@implementation Mesh;
@synthesize m_vertices[MaxVertices];
@end
我第一次这样写了一个错误。 如何使用c-struct数组设置属性,或自定义setter和getter? 任何提示将不胜感激!
答案 0 :(得分:2)
使用
@property (nonatomic) Vertex *m_vertices;
和
@synthesize m_vertices;
代替。你不能使用像这样的静态数组; malloc()它在构造函数中使用类似的东西,在析构函数中使用free():
- (id)init
{
if ((self = [super init]))
{
m_vertices = malloc(sizeof(*m_vertices) * NUM_OF_VERTICES);
}
return self;
}
- (oneway void)dealloc
{
free(m_vertices);
[super dealloc];
}
答案 1 :(得分:1)
这是我能得到的结果。
typedef struct _Vertex {
float x, y, z;
float nx, ny, nz;
float u, v;
} Vertex;
#define MaxVertices 5
@interface Mesh : NSObject{
Vertex m_verticesX[MaxVertices];
Vertex *m_vertices;
}
@property (nonatomic) Vertex *m_vertices;
@end
@implementation Mesh;
@synthesize m_vertices;
- (Vertex *)m_vertices
{
if (!m_vertices)
m_vertices = m_verticesX;
return m_vertices;
}
@end
希望它有所帮助。
答案 2 :(得分:1)
您不能将数组用作属性。你可以做两件事:
1)使用NSArray或NSMutableArray来保存对象而不是结构。
或
2)将数组放入结构中:
typedef struct VertexArray
{
struct Vertex m_vertices [MaxVertices];
};
@property (nonatomic, assign) VertexArray* m_vertices;
或
3)将数组放入对象
@interface VertexArray
{
struct Vertex m_vertices [MaxVertices];
}
- (struct Vertex)getVertexofIndex:(NSUInteger)index;
- (void)setVertex:(struct Vertex)vertex atIndex:(NSUInteger)index;
@end
以及Mesh中的属性:
@property (nonatomic, retain) VertexArray* m_vertices;
或者您可以将VertexArray的内容直接放在Mesh中(即成员变量和两个访问器方法)。
答案 3 :(得分:0)
当您在C中返回(任何类型)的数组时,您将返回该数组的第一个索引。
所以如果我想返回接口中声明的变量,那么
Vertex m_vertices[MaxVertices];
我可以说......
- (Vertex *)m_vertices
{
return m_vertices;
}
以上就是说......
- (Vertex *)m_vertices
{
return &m_vertices[0];
}
如果你想返回整个数组,那么最好的办法就是使用memcpy指令。
memcpy(<#void *#>, <#const void *#>, <#size_t#>)
在此处引用:http://www.cplusplus.com/reference/cstring/memcpy/
像这样编写函数......
- (Vertex *)m_vertices
{
Vertex *localVertex;
memcpy(localVertex,&m_vertices,sizeof(Vertex)* MaxVertices);
return localVertex;
}
这会复制文字字节并且非常快。它将返回整个阵列。
更好的方法是制作这样的函数。
- (Vertex *)m_vertices_nthIndex:(int)index
{
return(&m_vertices[index]);
}
通过这种方式,您可以获得所需项目的索引。