Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c C99指定的初始值设定项或CGMake宏?_Objective C_C99 - Fatal编程技术网

Objective c C99指定的初始值设定项或CGMake宏?

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, .

作为现代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, .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}将…更新问题以删除编译问题。