2008-12-25 70 views

回答

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

一个很好的建议,虽然有拳击和拆箱的性能。这并不可怕,但如果你需要速度的话,这一点是值得注意的。 – 2011-09-18 20:52:52

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的struct组件的名称,您的值可以是适用的Cocoa包装器中包装的相应数据类型。然后把这些字典放在一个NSArray中。

我想主要是你有很多选择。如果我是你,我会做一些尝试,看看最好的。

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

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

+0

嘿彼得,现在我不认为我需要这些,但仍然是我感兴趣的话题。我刚刚打开了一个具体问题:http://stackoverflow.com/questions/393662 – 2008-12-26 10:00:16

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

相关问题