【问题标题】:C99 designated initializers or CGMake Macros?C99 指定初始化器还是 CGMake 宏?
【发布时间】:2014-02-04 02:32:52
【问题描述】:

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};

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

Cocoa Coding Convention 文档中没有关于此的内容,而我遇到的样式指南之一指出它是 GitHub 样式指南:https://github.com/github/objective-c-conventions

【问题讨论】:

  • CGRect rect = (CGRect){.x = x, .y = y, .width = width, .height = height}; 不会编译,但 CGRect rect = (CGRect){.origin.x = x, .origin.y = y, .size.width = width, .size.height = height}; 会...
  • 更新了问题以消除编译问题。

标签: objective-c c99


【解决方案1】:

来自Apple's CGGeometry reference

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

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

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

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

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

基本上没关系,用函数就好。

【讨论】:

  • CGRectMake() 不执行此类标准化。
  • 除了@GregParker 所说的之外,最初的问题是关于CGRectMake,在NYT 风格指南中从未提及。关于将CGRect 作为参数 的函数,而不是返回CGRects 的函数,您的答案是正确的。
  • 感谢您的反馈。我更新了我的答案以澄清这些观点。
【解决方案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. 一种安全形式。如果使用宏,则必须提供所有结构元素。你不能不小心漏掉一个。

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

【讨论】:

    猜你喜欢
    • 2014-10-12
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2023-03-12
    • 2014-12-29
    • 1970-01-01
    相关资源
    最近更新 更多