Objective c C99指定的初始值设定项或CGMake宏?
作为现代Objective-C中的惯例,C99指定的初始值设定项或各种CGSizeMake、CZRectMake等宏是否更可取 这似乎是一种个人风格偏好,但我看到C99风格的一个优势是,价值观的意图是明确和明确的Objective c C99指定的初始值设定项或CGMake宏?,objective-c,c99,Objective C,C99,作为现代Objective-C中的惯例,C99指定的初始值设定项或各种CGSizeMake、CZRectMake等宏是否更可取 这似乎是一种个人风格偏好,但我看到C99风格的一个优势是,价值观的意图是明确和明确的 CGRect rect = CGRectMake(x, y, width, height) 如果您混淆了值的顺序,会让您心痛,如: CGRect rect = (CGRect){.origin.x = x, .origin.y = y, .size.width = width, .
CGRect rect = CGRectMake(x, y, width, height)
如果您混淆了值的顺序,会让您心痛,如:
CGRect rect = (CGRect){.origin.x = x, .origin.y = y, .size.width = width, .size.height = height};
毫无疑问,身高就是你给予它的价值。人们继续使用现有宏的原因是什么
Cocoa编码约定文档中没有关于这一点的内容,我遇到的一个样式指南指出它是GitHub样式指南:来自:
本参考文献中描述的所有函数都将CGRect数据结构作为输入,在计算结果之前隐式地标准化这些矩形。因此,应用程序应避免直接读取和写入存储在CGRect数据结构中的数据。相反,请使用此处描述的函数来操作矩形并检索其特征
因此,这些CGRect函数(例如CGRectGetWidth)将确保高度和宽度始终为非负值。(不“将CGRect数据结构作为输入”的CGRect函数,如CGRectMake,不会标准化rect的维度。)
此外,在数据结构发生变化的情况下(无可否认,这种情况极不可能发生),可以转换现有函数
最后,尽管您提到了Github风格的指南,但建议使用CGRect函数(与我上面提到的原因相同)
尽管在从cgrect获取值时可以使用内联函数,在创建它们时可以直接访问结构成员,但这种不一致性可能会损害代码的可读性。显然,正如你提到的,这是一个风格问题
基本上,这无关紧要,但要使用函数
作为现代Objective-C中的惯例,C99指定的初始值设定项或各种CGSizeMake、CZRectMake等宏是否更可取
这两种风格在客观上都不可取。CGRect
、CGPoint
和CGSize
结构的格式是公共文档的一部分,因此与CGRectMake
的参数顺序一样有效地不可更改,因此使用文字是可以的。是使用文字还是使用Make
函数取决于个人喜好
我倾向于使用CGRectMake
而不是文字,因为我可以轻松访问所有坐标。当我不得不使用额外语句或发送两次消息时,我更喜欢文本。例如,假设我想制作一个原点为(0,0)且大小为视图大小的矩形。我可以用CGRectMake
这样做:
CGRect rect = CGRectMake(0, 0, view.bounds.size.width, view.bounds.size.height);
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 };
但是我会发送两次bounds
消息。我可以这样发送一次:
CGRect rect = CGRectMake(0, 0, view.bounds.size.width, view.bounds.size.height);
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 };
或者像这样:
CGRect rect = CGRectMake(0, 0, view.bounds.size.width, view.bounds.size.height);
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 };
但我更喜欢这样的文字:
CGRect rect = CGRectMake(0, 0, view.bounds.size.width, view.bounds.size.height);
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 };
人们继续使用现有宏的原因是什么
熟悉。许多人不熟悉字面语法,他们也不会通过阅读苹果的文档来学习它
安全的一种形式。如果使用宏,则必须提供所有结构元素。你不能不小心漏掉一个
另一方面,必须按正确的顺序放置元素。因此,严格来说,它并不比文字更安全
CGRectMake()不执行此类标准化。除了@GregParker所说的,最初的问题是关于CGRectMake
,这在《纽约时报风格指南》中从未提及。对于以CGRect
为参数的函数,而不是返回CGRect
的函数,您的答案是正确的。感谢您的反馈。我更新了我的答案来澄清这些问题代码>将不编译,但CGRect rect=(CGRect){.origin.x=x、.origin.y=y、.size.width=width、.size.height=height}代码>将…更新问题以删除编译问题。