将结构文字传递给 ObjC 方法

Passing struct literal to ObjC method

a talk at the @Scale 2014 conference (around 32:30), Facebook presented their implementation of a declarative UI approach. The slides for a more detailed version of the talk can be found here期间。

基本上他们提供了这样的函数调用(我根据演讲中的示例制作了自己的简化示例):

[CPInsetComponent
  newWithStyle:{
    .margin = 15
  }
];

我的问题是:这是有效的 ObjC 代码吗?我试着自己实现这个

typedef struct {
  uint margin;
} CPInsetComponentStyle;


@interface CPInsetComponent : NSObject

+ (SomeOtherStruct) newWithStyle:(CPInsetComponentStyle)style;

@end

但我仍然在 newWithStyle:{ 行收到 "expected expression" 错误。你能给我一个方法声明的提示吗?

编译器可能不知道您的文字结构声明的类型是否正确。对于复合文字,您需要在括号中提供类型,后跟用大括号括起来的初始化列表。

[CPInsetComponent newWithStyle:(CPInsetComponentStyle){
  .margin = 15
}];

不,那不是有效的 Objective-C 代码。结构类型的 C99 复合文字如下所示:

(TheStructType) { .field1 = initializer1, .field2 = initializer2 }

其中字段指示符是可选的。

我可以想象他们提供的代码实际上是 Objective-C++。在 C++11 中,如果满足某些条件,编译器可以插入对采用初始化列表的构造函数的隐式调用;因此,通常你可以只将一个初始化列表传递给一个函数。