我在一些示例代码中看到了下面的语法,但我不确定是否理解它。
CGRect imageRect = (CGRect){.size = baseImage.size};
这只是一种初始化CGRect
等效于:
CGRect imageRect = CGRectMake(0,0,baseImage.size.width, baseImage.size.height);
除了稍微减少输入外,这种语法有什么好处吗?
答案 0 :(得分:41)
那是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字段初始化列表中不会自动完成结构字段名称。
答案 1 :(得分:4)
这不仅仅是简写语法,但如果您只想更改CGRect
中的大小而不是原点,反之亦然。
例如:我只想改变大小,位置有一个复杂的语法,我不想改变它。诺拉利,我会做的
CGRect imageRect = CGRectMake(sprite.origin.x,sprite.origin.y,40, 60);
使用其他语法我会做
CGRect imageRect = (CGRect){.size = sprite.size};
我们也可以直接使用加,减和乘法方法 例如
CGRect imageRect = (CGRect){.size = ccpAdd(sprite.size,addsize)};
希望这有帮助
答案 2 :(得分:0)
看起来像C99 / GCC样式初始化http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html