我以前没见过的CGRect语法

No *_*ing 26 core-graphics ios

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

 CGRect imageRect = (CGRect){.size = baseImage.size};
Run Code Online (Sandbox Code Playgroud)

这只是一种初始化CGRect等价物的简便方法:

 CGRect imageRect = CGRectMake(0,0,baseImage.size.width, baseImage.size.height);
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*her 41

这是C99初始化程序语法.您可以将它与任何结构一起使用.

Objective-C的主要优点是它为您提供了一些非常类似Objective-C的语法,其中字段接近值而不是定位所暗示的.(这并不是说这是故意相似的,或者说这是唯一的优势.但这很好.)

它有时略打字,但我现在在任何地方使用它.

考虑:

CGRect a = CGRectMake(a+c/2, b+d/2, c, d);
Run Code Online (Sandbox Code Playgroud)

为了理解这一点,您需要了解参数的顺序.你还需要能够用眼睛轻松捕捉逗号.在这种情况下,这很容易,但如果表达式更复杂,您可能首先将它们存储在临时变量中.

C99方式:

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

它更长,但它更明确.无论表达多长时间,都可以很容易地按照指定的内容进行操作.它也更像是Objective-C方法.毕竟,如果CGRect是一个类,它可能看起来像这样:

CGRect *a = [[CGRect alloc] initWithOriginX:x originY:y width:w height:h];
Run Code Online (Sandbox Code Playgroud)

你也可以做这样的事情:

CGRect a = (CGRect){
    .origin = myOrigin,
    .size = computedSize
};
Run Code Online (Sandbox Code Playgroud)

在这里,你使用CGPoint和建立一个矩形CGSize.编译器理解.origin期望a CGPoint,并.size期望a 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
};
Run Code Online (Sandbox Code Playgroud)

CGRectMake功能早于C99.我没有证据证明这种效果,但我认为如果C99首先出现CGRectMake可能根本就不存在; 当你的语言没有直接的方法来执行初始化时,它就是你写的那种硬壳函数.但现在确实如此.

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

不幸的是,从4.6开始,Xcode在C99字段初始化列表中不会自动完成结构字段名称.

  • 谢谢.虽然XCode autoComplete似乎还不知道该语法,但我可以看到您描述的好处. (4认同)
  • 顺便说一下,你也可以这样做:`CGRect a =(CGRect){myOrigin,computedSize};` (2认同)