【发布时间】:2008-12-25 20:12:09
【问题描述】:
在 Cocoa 中创建结构数组最简单的方法是什么?
【问题讨论】:
标签: objective-c cocoa
在 Cocoa 中创建结构数组最简单的方法是什么?
【问题讨论】:
标签: objective-c cocoa
如果你想使用 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];
【讨论】:
或者动态分配:
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);
}
【讨论】:
如果您对常规的旧 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 中。
我想要点是您有很多选择。如果我是你,我会做一些试验,看看什么效果最好。
【讨论】:
它需要是一个结构吗?如果可以的话,通常最好把它变成一个对象。然后你可以使用 KVC 和 Bindings 之类的东西。
【讨论】:
使用类更容易,但是如果您需要使用 C 和目标 c 结构(如 CGRect 或其他)怎么办。我尝试使用 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
【讨论】: