为什么要使用像CGRectMake这样的函数?

Jon*_*an. 19 iphone cocoa-touch core-graphics objective-c compound-literals

我很好奇为什么像CGRectMake和CGPointMake这样的函数存在并被广泛使用.相反,你可以这样做:

(CGRect){{x, y}, {width, height}}
Run Code Online (Sandbox Code Playgroud)

肯定这是更有效的(虽然我猜不多)因为没有函数调用?

您还可以设置原点和大小,如:

 (CGRect){origin, size}
Run Code Online (Sandbox Code Playgroud)

并作为混合物:

 (CGRect){origin, {width, height}}
Run Code Online (Sandbox Code Playgroud)

不使用它的原因是什么,更喜欢Make功能?

Kal*_*lle 13

实际上,效率并不高.该CGRectMake功能(及其他)被声明为static inline,这意味着编译器复制粘贴功能代码直入每一个它的使用场所:

CG_INLINE CGRect
CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height)
Run Code Online (Sandbox Code Playgroud)

哪里

#  define CG_INLINE static inline
Run Code Online (Sandbox Code Playgroud)

你来自

// code
CGRect myRect = CGRectMake(1,2,3,4);
// code
Run Code Online (Sandbox Code Playgroud)

// code
CGRect myRect;
myRect.origin.x = 1; myRect.origin.y = 2;
myRect.size.width = 3; myRect.size.height = 4;
Run Code Online (Sandbox Code Playgroud)

这原则上没有什么不同

CGRect myRect = (CGRect){1,2,3,4};
Run Code Online (Sandbox Code Playgroud)

经过编译器优化等.

如上所述,您添加依赖于CGRect作为以某种方式对齐的4个数字的结构,而不是使用对其具有更多保证的函数.


ser*_*gio 8

我想这是旧的区别:

  1. 从数据结构的内部定义中添加代码中的依赖项;

  2. 使用封装该知识的函数,可以"掩盖"底层数据结构中的任何更改.

原则上,CGRect可能演变成与它的一个成熟的类origin,size,等等,存取等...我不是说这将是明智的,或者它是可能的,只是为什么您使用的功能,之所以创建的实例数据结构与代码对更改的弹性有关.


jus*_*tin 6

C99的复合文字语法是一个有点模糊的功能.有些人发现Make函数更清晰,或者他们发现它更熟悉.在工具链支持的这个阶段,它只是偏好.

我很好奇为什么像CGRectMake和CGPointMake这样的函数存在......

CGRectMake(自10.0起可用)在OS X的编译器支持复合文字之前.复合文字在GCC 3.1(2002年5月)正式完成.