间距和格式
空格与制表符
仅使用空格,每次缩进 2 个空格。我们使用空格进行缩进。不要在代码中使用制表符(Tab)。
你应该将编辑器设置为按 Tab 键时输出空格,并在行尾去除尾随空格。
行长度
Objective-C 文件的最大行长度为 100 列。
方法声明和定义
- 或 + 和返回类型之间应使用一个空格。通常,参数列表中除参数之间外不应有空格。
方法应如下所示:
// GOOD:
- (void)doSomethingWithString:(NSString *)theString {
...
}星号前的空格是可选的。添加新代码时,与周围文件的风格保持一致。
如果方法声明无法放在一行上,将每个参数放在自己的行上。除第一行外的所有行至少缩进四个空格。参数前的冒号应在所有行上对齐。如果方法声明第一行上参数前的冒号的位置会导致后续行的缩进少于四个空格,则冒号对齐仅要求除第一行外的所有行对齐。如果方法声明或定义中 : 后声明的参数会导致超出行长度限制,则将内容换行到下一行,至少缩进四个空格。
// GOOD:
- (void)doSomethingWithFoo:(GTMFoo *)theFoo
rect:(NSRect)theRect
interval:(float)theInterval {
...
}
- (void)shortKeyword:(GTMFoo *)theFoo
longerKeyword:(NSRect)theRect
someEvenLongerKeyword:(float)theInterval
error:(NSError **)theError {
...
}
- (id<UIAdaptivePresentationControllerDelegate>)
adaptivePresentationControllerDelegateForViewController:(UIViewController *)viewController;
- (void)presentWithAdaptivePresentationControllerDelegate:
(id<UIAdaptivePresentationControllerDelegate>)delegate;
- (void)updateContentHeaderViewForExpansionToContentOffset:(CGPoint)contentOffset
withController:
(GTMCollectionExpansionController *)controller;
函数声明和定义
优先将返回类型与函数名放在同一行,并在同一行上附加所有参数(如果能放下)。将不适合放在一行上的参数列表换行,方式与函数调用中的参数换行相同。
// GOOD:
NSString *GTMVersionString(int majorVersion, int minorVersion) {
...
}
void GTMSerializeDictionaryToFileOnDispatchQueue(
NSDictionary<NSString *, NSString *> *dictionary,
NSString *filename,
dispatch_queue_t queue) {
...
}函数声明和定义还应满足以下条件:
- 左括号必须始终与函数名在同一行。
- 如果返回类型和函数名无法放在同一行,在它们之间断开且不缩进函数名。
- 左括号前永远不应有空格。
- 函数括号和参数之间永远不应有空格。
- 左大括号始终在函数声明最后一行的末尾,而不是下一行的开头。
- 右大括号要么单独占一行,要么与左大括号在同一行。
- 右括号和左大括号之间应有一个空格。
- 所有参数应尽可能对齐。
- 函数作用域应缩进 2 个空格。
- 换行的参数应缩进 4 个空格。
条件语句
在 if、while、for 和 switch 之后以及比较运算符周围包含一个空格。
// GOOD:
for (int i = 0; i < 5; ++i) {
}
while (test) {};当循环体或条件语句能放在一行上时,可以省略大括号。
// GOOD:
if (hasSillyName) LaughOutLoud();
for (int i = 0; i < 10; i++) {
BlowTheHorn();
}// AVOID:
if (hasSillyName)
LaughOutLoud(); // AVOID.
for (int i = 0; i < 10; i++)
BlowTheHorn(); // AVOID.如果 if 子句有 else 子句,两个子句都应使用大括号。
// GOOD:
if (hasBaz) {
foo();
} else { // else 与右大括号在同一行。
bar();
}// AVOID:
if (hasBaz) foo();
else bar(); // AVOID.
if (hasBaz) {
foo();
} else bar(); // AVOID.有意贯穿(Fall-through)到下一个 case 时应添加注释,除非该 case 在下一个 case 之前没有代码。
// GOOD:
switch (i) {
case 1:
...
break;
case 2:
j++;
// 贯穿。
case 3: {
int k;
...
break;
}
case 4:
case 5:
case 6: break;
}表达式
在二元运算符和赋值周围使用空格。一元运算符前后省略空格。不要在括号内添加空格。
// GOOD:
x = 0;
v = w * x + y / z;
v = -y * (x + z);表达式中的因子可以省略空格。
// GOOD:
v = w*x + y/z;方法调用
方法调用的格式应与方法声明类似。
当有多种格式风格可选时,遵循给定源文件中已使用的约定。调用应将所有参数放在一行上:
// GOOD:
[myObject doFooWith:arg1 name:arg2 error:arg3];或者每个参数一行,冒号对齐:
// GOOD:
[myObject doFooWith:arg1
name:arg2
error:arg3];不要使用以下任何风格:
// AVOID:
[myObject doFooWith:arg1 name:arg2 // 某些行有多个参数
error:arg3];
[myObject doFooWith:arg1
name:arg2 error:arg3];
[myObject doFooWith:arg1
name:arg2 // 对齐关键字而不是冒号
error:arg3];与声明和定义一样,当第一个关键字比其他关键字短时,后续行至少缩进四个空格,保持冒号对齐:
// GOOD:
[myObj short:arg1
longKeyword:arg2
evenLongerKeyword:arg3
error:arg4];包含多个内联块(Block)的调用可以将其参数名左对齐到四个空格的缩进位置。
函数调用
函数调用应在每行上包含尽可能多的参数,除非需要较短的行以提高清晰度或文档化参数。
函数参数的续行可以缩进以与左括号对齐,或可以使用四个空格的缩进。
// GOOD:
CFArrayRef array = CFArrayCreate(kCFAllocatorDefault, objects, numberOfObjects,
&kCFTypeArrayCallBacks);
NSString *string = NSLocalizedStringWithDefaultValue(@"FEET", @"DistanceTable",
resourceBundle, @"%@ feet", @"Distance for multiple feet");
UpdateTally(scores[x] * y + bases[x], // 得分启发式。
x, y, z);
TransformImage(image,
x1, x2, x3,
y1, y2, y3,
z1, z2, z3);使用具有描述性名称的局部变量来缩短函数调用并减少调用嵌套。
// GOOD:
double scoreHeuristic = scores[x] * y + bases[x];
UpdateTally(scoreHeuristic, x, y, z);异常
将 @catch 和 @finally 标签格式化在前一个 } 的同一行上。在 @ 标签和左大括号 ({) 之间添加一个空格,以及在 @catch 和捕获的对象声明之间也添加一个空格。如果你必须使用 Objective-C 异常,请按以下格式设置。但请参阅避免抛出异常了解你不应使用异常的原因。
// GOOD:
@try {
foo();
} @catch (NSException *ex) {
bar(ex);
} @finally {
baz();
}函数长度
优先使用小而专注的函数。
长函数和方法有时是合适的,因此对函数长度没有硬性限制。如果一个函数超过约 40 行,请考虑是否可以在不损害程序结构的情况下将其分解。
即使你的长函数现在运行完美,几个月后修改它的人可能会添加新行为。这可能导致难以发现的 bug。保持函数简短让其他人更容易阅读和修改你的代码。
更新遗留代码时,也要考虑将长函数分解为更小、更易管理的部分。
垂直空白
谨慎使用垂直空白。
为了在屏幕上更容易查看更多代码,避免在函数大括号内部放置空行。
函数之间和代码逻辑组之间限制空行为一到两行。