代码之家  ›  专栏  ›  技术社区  ›  Steph Thirion

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

  •  18
  • Steph Thirion  · 技术社区  · 16 年前

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

    5 回复  |  直到 16 年前
        1
  •  44
  •   Ashley Clark    16 年前

    如果你想使用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];
    
        2
  •  20
  •   Georg Schölly Crazy Developer    16 年前

    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);
    }
    
        3
  •  12
  •   Rich Catalano    16 年前

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

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

    编辑:这是我没有做过但只是想到的事情。仔细想想,NSDictionary基本上是对象的结构。您的键可以是作为NSString的结构组件的名称,并且您的值可以是封装在相应Cocoa包装器中的相应数据类型。然后把这些字典放在一个垃圾堆里。

        4
  •  2
  •   Peter Hosey    16 年前

    它需要是一个结构吗?如果可以的话,最好把它做成一个物体。然后可以使用KVC和绑定之类的东西。

        5
  •  0
  •   Community CDub    8 年前

    使用类更容易,但如果您需要使用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