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
答案 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中的惯例?
一般来说,这两种风格都不客观。 CGRect
,CGPoint
和CGSize
结构的格式是公共文档的一部分,因此有效地与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 };
人们继续使用现有宏的原因是什么?
熟悉。许多人不熟悉字面语法,他们不会通过阅读Apple的文档来学习它。
一种安全形式。如果使用宏,则必须提供所有结构元素。你不能不小心省略一个。
另一方面,您必须按正确顺序放置元素。所以它并不比文字更安全。