【问题标题】:CGRect syntax I haven't seen before我以前没见过的 CGRect 语法
【发布时间】:2013-02-06 07:28:55
【问题描述】:

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

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

这是否只是初始化 CGRect 的简写方式,相当于:

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

这种语法除了打字少一点之外还有什么好处吗?

【问题讨论】:

  • 就像 [NSNumber numberWithInt:1] 等于 @(1)
  • 1) 是 2) 不,一个缺点是自动完成功能参差不齐

标签: ios core-graphics


【解决方案1】:

那是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 字段初始值设定项列表中自动完成结构字段名称。

【讨论】:

  • 谢谢。尽管 XCode autoComplete 似乎还不知道该语法,但我可以看到您描述的好处。
  • 我必须相信你的话;自动完成不起作用对我来说仍然不足为奇。我还没有试图弄清楚是什么具体的事情打破了它。 :)
  • 看来你是对的。我会在答案中注明这一点。
  • 顺便说一句,你也可以这样做:CGRect a = (CGRect){ myOrigin, computedSize };
  • 我不知道。在变量命名良好的情况下,这将非常方便。谢谢。
【解决方案2】:

这不仅是简写语法,而且在您只想更改 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)};

希望对你有帮助

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2013-09-17
      • 2021-07-18
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多