在Cocoa中创建结构数组的最简单方法是什么?
答案 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