那是C99 initializer syntax。您可以将其与任何结构一起使用。
Objective-C 的主要优点是它为您提供了一些非常类似于 Objective-C 的语法,其中字段接近值而不是通过定位隐含。 (这并不是说这是故意相似,或者这是唯一的优势。但它很好。)
有时会稍微更多打字,但我现在到处都在使用它。
考虑:
CGRect a = CGRectMake(a+c/2, b+d/2, c, d);
为了理解这一点,您需要了解参数的顺序。您还需要能够用眼睛轻松捕捉逗号。在这种情况下,这很容易,但如果表达式更复杂,您可能会先将它们存储在临时变量中。
C99 方式:
CGRect a = (CGRect){
.origin.x = a+c/2,
.origin.y = b+d/2,
.size.width = c,
.size.height = d
};
它更长,但更明确。无论表达式有多长,也很容易遵循分配给什么的内容。它也更像是一种 Objective-C 方法。毕竟,如果 CGRect 是一个类,它可能看起来像这样:
CGRect *a = [[CGRect alloc] initWithOriginX:x originY:y width:w height:h];
你也可以这样做:
CGRect a = (CGRect){
.origin = myOrigin,
.size = computedSize
};
在这里,您正在使用CGPoint 和CGSize 构建一个矩形。编译器知道.origin 需要CGPoint,而.size 需要CGSize。你已经提供了。所有的肉汁。
等效代码为CGRectMake(myOrigin.x, myOrigin.y, size.width, size.height)。通过使用CGRectMake,您不再向编译器表达相同的含义。它不能阻止您将部分尺寸分配给原点。它也不会阻止您将宽度分配给高度。它甚至没有给你一个很好的线索来判断哪个是 X 和 Y。如果你使用过先提供垂直坐标的 API,你会弄错的。
您可以从结构中分配部分,也可以从浮动中分配部分:
CGRect a = (CGRect){
.origin = myOrigin,
.size.width = c,
.size.height = d
};
CGRectMake 函数早于 C99。我没有证据表明这一点,但我认为如果 C99 先出现CGRectMake 可能根本不存在;当您的语言无法直接执行初始化时,这是您编写的那种硬壳函数。但现在可以了。
基本上,如果您使用一段时间,您可能会更喜欢 C99 语法。它更明确、更灵活、更类似于 Objective-C 并且更难搞砸。
不幸的是,从 4.6 开始,Xcode 将不会在 C99 字段初始值设定项列表中自动完成结构字段名称。