CGRect语法我以前没见过

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

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

这是简单的初始化一个CGRect等价于:

  CGRect imageRect = CGRectMake(0,0,baseImage.size.width, baseImage.size.height); 

这种语法除了less打字以外,还有什么好处?

这是C99的初始化语法 。 你可以使用任何结构。

Objective-C的主要优点是它给了你一些非常类似Objective-C的语法,其中字段接近于值而不是定位所暗示的。 (这并不是说这是故意的相似,也不是说它是唯一的优势,但它很好。)

有时稍微打字,但现在我到处使用它。

考虑:

 CGRect a = CGRectMake(a+c/2, b+d/2, c, d); 

为了理解这个,你需要了解参数的顺序。 你也需要能够用眼睛轻松地抓住逗号。 在这种情况下,这很容易,但是如果expression式更复杂,你可能首先将它们存储在临时variables中。

C99方式:

 CGRect a = (CGRect){ .origin.x = a+c/2, .origin.y = b+d/2, .size.width = c, .size.height = d }; 

它更长,但更明确。 无论expression有多长时间,遵循分配的内容也很容易。 这也更像是一个Objective-C方法。 毕竟,如果CGRect是一个类,它可能看起来像这样:

 CGRect *a = [[CGRect alloc] initWithOriginX:x originY:y width:w height:h]; 

你也可以做这样的事情:

 CGRect a = (CGRect){ .origin = myOrigin, .size = computedSize }; 

在这里,您正在使用CGPointCGSize构build一个矩形。 编译器明白.origin需要一个CGPoint ,而CGSize需要一个CGSize 。 你已经提供了。 所有的肉汁。

等价的代码是CGRectMake(myOrigin.x, myOrigin.y, size.width, size.height) 。 通过使用CGRectMake你不再向编译器expression同样的含义。 它不能阻止你将大小的一部分分配给原点。 它也不会阻止你将宽度分配给高度。 它甚至不能给你一个关于哪一个是X和Y的好的线索; 如果您已经使用了提供垂直坐标的API,那么您会错误的。

您可以从结构中分配零件,也可以从浮动中分配零件:

 CGRect a = (CGRect){ .origin = myOrigin, .size.width = c, .size.height = d }; 

CGRectMake函数早于C99。 我没有这方面的证据,但是我认为如果C99先来了, CGRectMake可能根本就不存在; 当你的语言没有直接的方法来执行初始化的时候,这就是你写的那种笨拙的function。 但现在呢。

基本上,如果你使用它一段时间,你可能会喜欢C99语法。 它更明确,更灵活,更像Objective-C,更难搞砸了。

不幸的是,从4.6开始,在C99字段初始值设定项列表中,Xcode不会自动完成结构字段名称。

这不仅仅是简写的语法,而且当你只想改变CGRect的大小而不是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)}; 

希望这可以帮助

它看起来像C99 / GCC风格初始化http://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html