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字段初始化列表中不会自动完成结构字段名称.
| 归档时间: |
|
| 查看次数: |
16609 次 |
| 最近记录: |