2. 间隔与格式化 空格对tab键,仅使用空格,缩进两个。
我们使用空格用于缩进,不要在编码时使用tab键,你应该设置你的编辑器将tab键转换成对应的空格。
行长度
代码中的每行文本不要超过80个字符的长度。
尽管Objective-C正变得比C++更加繁冗,为了保持规范 的互通性,我们还是决定保持80字符长度的限制。这比你想象中的更容易做到。
我们知道本条款是有争议的,但已有此多的代码已经遵从了本条款,即使只是保持一致性也是一个充足的理由。
你可以在Xcode里清楚地发现代码中的违规,设置Xcode>Preferences>TextEditi ng>Showpageguide.(之后就可以在代码编辑区域里看到一条指定字符长度的指示线了)
方法声明与定义
留一个空格在-或+和返回类型之间,但参数列表里的参数之间不要留间隔。
方法应该写成这样:
Objective-C代码
1. - (void)doSomethingWithString:(NSString *)theString {
2. ...
3. }
星号前的空格是可选的,你可以根据原来的代码风格自行决定。
如果参数过多,推荐每个参数各占一行。使用多行的情况下,在参数前加冒号用于对齐:
(很遗憾这里仅有Google Chrome浏览器能看出是冒号对齐的......)
Objective-C代码
1. - (void)doSomethingWith:(GTMFoo *)theFoo
2. rect:(NSRect)theRect
3. interval:(float)theInterval {
4. ...
5. }
当第一个关键字比其他的短时,后续行至少缩进四个空格。这样你可以让后续的关键字垂直对齐,而不是用冒号对齐:
Objective-C代码
1. - (void)short:(GTMFoo *)theFoo
2. longKeyword:(NSRect)theRect
3. evenLongerKeyword:(float)theInterval {
4. ...
5. }
方法调用
方法调用的格式和方法声明时的格式时一致的,如果格式风格可选,遵从原有代码的风格。
调用应该将所有参数写在一行:
Objective-C代码
1. [myObject doFooWith:arg1 name:arg2 error:arg3];
或者每个参数一行,用冒号对齐:
(对齐效果如前说明......)
Objective-C代码
1. [myObject doFooWith:arg1
2. name:arg2
3. error:arg3];
不要使用如下风格的写法
Objective-C代码
1. [myObject doFooWith:arg1 name:arg2 // some lines with >1 arg
2. error:arg3];
3.
4. [myObject doFooWith:arg1
5. name:arg2 error:arg3];
6.
7. [myObject doFooWith:arg1
8. name:arg2 // aligning keywords instead of colons
9. error:arg3];
在声明和定义时,如果因为关键字长度使就算有四个空格在前仍然无法用冒号对齐,那么就让后续行缩进四个空格而不是冒号对齐:
Objective-C代码
1. [myObj short:arg1
2. longKeyword:arg2
3. evenLongerKeyword:arg3];
权限控制符@public和@private缩进一个空格.
类似C++的public,protected,private:
Objective-C代码
1. @interface MyClass : NSObject {
2. @public
3. ...
4. @private
5. ...
6. }
7. @end
异常
每个异常标签的@和开括号({)写在统一行,标签和开括号间隔一个空格,同样适用于@catch语句。
如果你决定使用Objective-C的异常,那么就按如下格式,不过你最好先看看AvoidThrowingExceptions(见后)条款,了解为何你不应使用异常 。
Objective-C代码
1. @try {
2. foo();
3. }
4. @catch (NSException *ex) {
5. bar(ex);
6. }
7. @finally {
8. baz();
9. }
命名
命名规则对于维护代码来说是非常重要的。Objective-C方法名往往很长,不过这也有好处,读代码就像读散文(放屁),让很多注释变得毫无意义。
写纯Objective-C代码时,我们基本上遵守标准Objective-Cnamingrules,这些规则和C++ 的规则有很大的不同。比如Google的C++代码规范推荐变量名构词之间使用下划线隔开,而本文档推荐驼峰法,也是Objective-C社区的标准。
所有类,类别,方法,以及变量如包括缩写,则缩写部分使用全大写的缩写(Initialisms)形式。这遵守Apple的标准,比如URL ,TIFF以及EXIF。
当写Objective-C++代码时,情况就不是那么单一了。许多项目需要实现带一些Objective-C代码的跨平台的C++APIs或者连接后台的C++代码与前台的原生Cocoa代码.这会造成两种规范直接冲突。
我们的解决方法是根据方法/函数风格来决定。如果在@implementation块,就使用Objective-C的命名规则;如果在C++的方法实现块,就使用C++的命名规则。避免了实体变量和本地变量在一个函数内命名规则冲突的情况,而这种情况是对可读性的极大损害。