创建结构数组的最简单方法是什么?

时间:2008-12-25 20:12:09

标签: objective-c cocoa

在Cocoa中创建结构数组的最简单方法是什么?

5 个答案:

答案 0 :(得分:44)

如果你想使用NSArray,你需要装箱你的结构。您可以使用NSValue类对它们进行编码。

像这样编码:

struct foo {
    int bar;
};

struct foo foobar;
foobar.bar = 3;
NSValue *boxedFoobar = [NSValue valueWithBytes:&foobar objCType:@encode(struct foo)];

然后让它退出:

struct foo newFoobar;

if (strcmp([boxedFoobar objCType], @encode(struct foo)) == 0)
    [boxedFoobar getValue:&newFoobar];

答案 1 :(得分:20)

或动态分配:

struct foo {
    int bar;
};

int main (int argc, const char * argv[]) {
    struct foo *foobar = malloc(sizeof(struct foo) * 3);
    foobar[0].bar = 7; // or foobar->bar = 7;

    free(foobar);
}

答案 2 :(得分:11)

如果你对普通的旧C阵列没问题:

struct foo{
    int bar;
};

int main (int argc, const char * argv[]) {
    struct foo foobar[3];
    foobar[0].bar = 7;
}

如果你想要一个NSArray,你需要一个包装器对象。大多数原语使用NSNumber,但这可能不适用于您的结构。包装器写起来并不是很难,尽管这样会破坏使用结构的目的!

编辑:这是我没有做过但只是想到的事情。如果你考虑一下,NSDictionary基本上是一个对象的结构。您的键可以是NSStrings的结构组件的名称,您的值可以是适用的Cocoa包装器中包含的相应数据类型。然后把这些词典放在NSArray中。

我想要的是,你有很多选择。如果我是你,我会做一些实验,看看什么效果最好。

答案 3 :(得分:2)

它需要是一个结构吗?如果可以的话,通常最好将它作为一个对象。然后你可以使用像KVC和Bindings这样的东西。

答案 4 :(得分:0)

使用类更容易,但如果您需要使用C和CGRect等目标c结构,该怎么办?我试过使用NSValue,但它很奇怪......:

CGRect rect =CGRectMake(20,220,280,30);
NSValue* rectValue = [NSValue valueWithCGRect:rect];
NSArray *params1;
params1= [NSArray arrayWithObjects:rectValue,nil];

但是,我只能将CGRect值作为:

CGRect cgr = [[params1 objectAtIndex:0] CGRectValue];

当我使用它时:

id currentVal = [params1 objectAtIndex:0];  
void* buffer;
buffer=[currentVal pointerValue];

导致错误......


问题已解决here