C99指定的初始化程序或CGMake宏?

时间:2014-02-04 02:32:52

标签: objective-c c99

C99指定初始化器或各种CGSizeMake,CZRectMake等宏是否更像现代Objective-C中的惯例?

这几乎看起来像个人风格偏好,但我看到的C99风格的一个优点是价值的意图清晰明确。

CGRect rect = CGRectMake(x, y, width, height) 
如果你混淆了值的顺序,那么

会让你心痛:

CGRect rect = (CGRect){.origin.x = x, .origin.y = y, .size.width = width, .size.height = height};

毫无疑问,.Hight正在获得你给它的价值。人们继续使用现有宏的原因是什么?

Cocoa Coding Convention中没有关于此的文档和我遇到的风格指南之一,它是GitHub风格指南:https://github.com/github/objective-c-conventions

2 个答案:

答案 0 :(得分:5)

来自Apple's CGGeometry reference

  

本参考中描述的所有函数都将CGRect数据结构作为输入,在计算结果之前隐式标准化这些矩形。因此,您的应用程序应避免直接读取和写入存储在CGRect数据结构中的数据。相反,使用此处描述的函数来操纵矩形并检索它们的特征。

因此,这些CGRect函数(例如CGRectGetWidth)将确保高度和宽度始终为非负值。 (CGRect函数“将CGRect数据结构作为输入”,如CGRectMake,不标准化rect的维度。)

此外,现有的功能可以在数据结构发生变化的(事实上极不可能)事件中转换。

最后,尽管你提到了Github风格指南,New York Times Objective-C Style Guide建议使用CGRect函数(出于我上面提到的相同原因)。

虽然在从CGRects获取值时可以使用内联函数,并在创建它们时直接使用struct member访问,但这种不一致可能会损害代码的可读性。显然,正如你所提到的,这是一个风格问题。

基本上,没关系,但使用功能。

答案 1 :(得分:2)

  

C99指定初始化器或各种CGSizeMake,CZRectMake等宏是否更像现代Objective-C中的惯例?

一般来说,这两种风格都不客观。 CGRectCGPointCGSize结构的格式是公共文档的一部分,因此有效地与CGRectMake的参数顺序不可更改,因此使用文字很好。是否使用文字或Make函数是个人品味的问题。

当我可以轻松访问所有坐标时,我倾向于使用CGRectMake而不是文字。当我不得不使用额外的声明或发送消息两次时,我更喜欢文字。例如,假设我想创建一个原点为(0,0)且大小为view的矩形。我可以用CGRectMake这样做:

CGRect rect = CGRectMake(0, 0, view.bounds.size.width, view.bounds.size.height);

但后来我发送了bounds次消息两次。我可以像这样发送一次:

CGRect rect = view.bounds;
rect.origin = CGPointZero;

或者像这样:

CGRect size = view.bounds.size;
CGRect rect = CGRectMake(0, 0, size.width, size.height);

但我更喜欢使用这样的文字:

CGRect rect = (CGRect){ .origin = CGPointZero, .size = view.bounds.size };
  

人们继续使用现有宏的原因是什么?

  1. 熟悉。许多人不熟悉字面语法,他们不会通过阅读Apple的文档来学习它。

  2. 一种安全形式。如果使用宏,则必须提供所有结构元素。你不能不小心省略一个。

    另一方面,您必须按正确顺序放置元素。所以它并不比文字更安全。