Objective-c:将自定义对象添加到NSMutableArray

0 struct objective-c nsmutablearray

我通常使用java或c ++编程,最近我开始使用objective-c.在objective-c中寻找向量,我发现NSMutableArray似乎是最好的选择.我正在做一个opengl游戏,我正在尝试为我的精灵创建一个NSMutableArray纹理四边形.这是相关代码:

我定义纹理四边形:

typedef struct {
    CGPoint geometryVertex;
    CGPoint textureVertex;
} TexturedVertex;

typedef struct {
    TexturedVertex bl;
    TexturedVertex br;    
    TexturedVertex tl;
    TexturedVertex tr;    
} TexturedQuad;
Run Code Online (Sandbox Code Playgroud)

我在界面中创建了一个数组:

@interface Sprite() {
    NSMutableArray *quads;
}
Run Code Online (Sandbox Code Playgroud)

我启动数组,我创建基于"宽度"和"高度"的texturesQuads,它们是单个精灵的尺寸,"self.textureInfo.width"和"self.textureInfo.height",它们是维度整个精灵表:

    quads = [NSMutableArray arrayWithCapacity:1];
    for(int x = 0; x < self.textureInfo.width/width; x++) {
    for(int y = 0; y < self.textureInfo.height/height; y++) {
        TexturedQuad q;
        q.bl.geometryVertex = CGPointMake(0, 0);
        q.br.geometryVertex = CGPointMake(width, 0);
        q.tl.geometryVertex = CGPointMake(0, height);
        q.tr.geometryVertex = CGPointMake(width, height);

        int x0 = (x*width)/self.textureInfo.width;
        int x1 = (x*width + width)/self.textureInfo.width;
        int y0 = (y*height)/self.textureInfo.height;
        int y1 = (y*height + height)/self.textureInfo.height;

        q.bl.textureVertex = CGPointMake(x0, y0);
        q.br.textureVertex = CGPointMake(x1, y0);
        q.tl.textureVertex = CGPointMake(x0, y1);
        q.tr.textureVertex = CGPointMake(x1, y1);

        //add q to quads
    }
    }
Run Code Online (Sandbox Code Playgroud)

问题是我不知道如何将四元组"q"添加到数组"四边形".简单的写[quads addObject:q]不起作用,因为参数应该是id而不是TexturedQuad.我已经看过如何从int等创建id的示例,但我不知道如何使用像TexturedQuad这样的对象.

N_A*_*N_A 5

它的本质是将C结构包装在Obj-C类中.要使用的Obj-C类是NSValue.

// assume ImaginaryNumber defined:
typedef struct {
    float real;
    float imaginary;
} ImaginaryNumber;

ImaginaryNumber miNumber;
miNumber.real = 1.1;
miNumber.imaginary = 1.41;

// encode using the type name
NSValue *miValue = [NSValue value: &miNumber withObjCType:@encode(ImaginaryNumber)]; 

ImaginaryNumber miNumber2;
[miValue getValue:&miNumber2];
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参见此处

正如@Bersaelor所指出的,如果你需要更好的性能,可以使用纯C或切换到Obj-C++并使用向量而不是Obj-C对象.