【问题标题】:What's the easiest way to create an array of structs?创建结构数组的最简单方法是什么?
【发布时间】:2008-12-25 20:12:09
【问题描述】:

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

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    如果你想使用 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】:

      或者动态分配:

      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】:

        如果您对常规的旧 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 中。

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

        【讨论】:

          【解决方案4】:

          它需要是一个结构吗?如果可以的话,通常最好把它变成一个对象。然后你可以使用 KVC 和 Bindings 之类的东西。

          【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2014-01-28
            • 1970-01-01
            • 2022-08-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-08-19
            相关资源
            最近更新 更多