我以前没见过的CGRect语法

时间:2013-02-06 07:28:56

标签: ios core-graphics

我在一些示例代码中看到了下面的语法,但我不确定是否理解它。

 CGRect imageRect = (CGRect){.size = baseImage.size};

这只是一种初始化CGRect等效于:

的简便方法
 CGRect imageRect = CGRectMake(0,0,baseImage.size.width, baseImage.size.height);

除了稍微减少输入外,这种语法有什么好处吗?

3 个答案:

答案 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
};

在这里,您使用CGPointCGSize构建矩形。编译器理解.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