【问题标题】:Box Custom Struct in Objective-C [duplicate]Objective-C中的框自定义结构[重复]
【发布时间】:2012-10-29 16:23:19
【问题描述】:

可能重复:
How to wrap a Struct into NSObject
Can the new Clang Objective-C literals be redirected to custom classes?

我有一个自定义结构:

typedef struct {
    float f1;
    float f2;
} MYCustomStruct;

我需要添加到NSArray。我已经编写了一个类别来创建这些结构的NSValues,然后将其添加到NSArray,但是如果可能的话,我想进一步简化它使用盒装表达式。我希望能够做到这一点:

@[@(instanceOfMYCustomStruct)];

但是,我遇到了以下错误:

在盒装表达式中使用了非法类型 'MYCustomStruct'

有没有办法使用带有自定义结构的盒装表达式?

【问题讨论】:

标签: objective-c struct objective-c-literals


【解决方案1】:

我会使用NSValue 来装箱结构,因为它具有内置支持。不幸的是,你不能使用 Objective-c 的酷文字,但是:

struct foo myStruct;
NSValue *val = [NSValue valueWithBytes:&myStruct objCType:@encode(typeof(myStruct))];

// to pull it out...
struct foo myStruct;
[val getValue:&myStruct];

虽然这在其他 objc 代码中可能笨拙且丑陋,但您必须问自己 - 为什么在 Objective-C 中首先使用struct?使用带有几个@property(s) 的对象几乎没有速度性能,我能看到的唯一真正原因是如果您正在与 C 库集成以与内存布局兼容,即使这样,一个Objective-c 对象的内存布局是明确定义的,只要超类不改变。

那么你对结构进行装箱的真正目的是什么?如果我们有,我们可以为您提供进一步的帮助。

【讨论】:

  • 如果你使用 Objective-C++,你可以定义一个重载的 Box() 函数,它接收你的结构并返回一个 NSValue。或者只是为了简洁起见将函数命名为 B(),并且不需要比 Objective-C 的拳击语法糖更多的字符。
  • 使用 Objective-C++ 你也可以定义一个operator NSValue*(const struct myStruct*) 来无缝转换它。
  • @adib true,在某些情况下可能是可以接受的,但这确实意味着该结构不再是 POD。
  • typedef struct __attribute__((objc_boxable)) { float f1; } 我的风格;我的类型一个; NSValue *val = @(a);
  • @paulotorrens 使用 __attribute__((objc_boxable))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
相关资源
最近更新 更多