Objective-C 编码规范(一)

Objective-C 编码规范(一)

目录

1 留白和格式

1.1 空格 VS 制表符

【建议】使用空格进行缩进。

不要在工程里使用Tab键,使用空格来进行缩进。
通过设置 Xcode > Preferences > Text Editing 将Tab和自动缩进都设置为4个空格。

  • 类方法声明在方法类型与返回类型之间要有空格。
 // 糟糕
-(void)methodName:(NSString *)string; 
// OK
 - (void)methodName:(NSString *)string;
  • 条件判断的括号内侧不应有空格。
// 糟糕
if ( a < b ) { 
// something
} 
// OK
if (a < b) {
 // something
}
  • 关系运算符(如 >= 、 != )和逻辑运算符(如 && 、 || )两边要有空格。
  // OK
(someValue > 100)? YES : NO 
// OK
(items)?: @[]

二元算数运算符两侧是否加空格不确定,根据情况自己定。一元运算符与操作数之前没有空格。
多个参数逗号后留一个空格(这也符合正常的西文语法)。


1.2 花括号

【建议】方法大括号和其他大括号(if/else/switch/while 等.)总是在同一行语句打开但在新行中关闭。

if (user.isHappy) {
    //Do something
} 
else {
    //Do something else
}

1.3 列数

【建议】尽量让你的代码保持在 80 列之内。

通过设置 Xcode > Preferences > Text Editing > Show page guide,来使越界更容易被发现。

1.4 方法的声明和定义

【建议】 +/- 和返回类型之间须使用一个空格,参数列表中只有参数之间可以有空格。

例:

+ (NSDate *)dateFromString:(NSString *)string{
    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSDate *date = [formatter dateFromString:string];
    [formatter release];
    return date;
}

星号前的空格是可选的。当写新的代码时,要与先前代码保持一致。如果一行有非常多的参数,更好的方式是将每个参数单独拆成一行。如果使用多行,将每个参数前的冒号对齐。

- (void)doSomethingWith:(GTMFoo *)theFoo    
                     rect:(NSRect)theRect
                 interval:(float)theInterval {
  ...
}

当第一个关键字比其它的短时,保证下一行至少有 4 个空格的缩进。这样可以使关键字垂直对齐,而不是使用冒号对齐:

- (void)short:(GTMFoo *)theFoo
    longKeyword:(NSRect)theRect
    evenLongerKeyword:(float)theInterval {
  ...
}

1.5 方法调用

【建议】方法调用应尽量保持与方法声明的格式一致。当格式的风格有多种选择时,新的代码要与已有代码保持一致。

调用时所有参数应该在同一行:

[myObject doFooWith:arg1 name:arg2 error:arg3];

或者每行一个参数,以冒号对齐:

 [myObject doFooWith:arg1
                name:arg2
               error:arg3];

方法定义与方法声明一样,当关键字的长度不足以以冒号对齐时,下一行都要以四个空格进行缩进。

 [myObj short:arg1
    longKeyword:arg2
    evenLongerKeyword:arg3];

1.6 协议名

【建议】类型标识符和尖括号内的协议名之间,不能有任何空格。

这条规则适用于类声明、实例变量以及方法声明。例如:

@interface MyProtocoledClass : NSObject<NSWindowDelegate> {
 @private
  id<MyFancyDelegate> delegate_;
}
- (void)setDelegate:(id<MyFancyDelegate>)aDelegate;
@end

@public 和 @private 访问修饰符应该以一个空格缩进。

1.7 块(闭包)

【建议】块(block)适合用在 target/selector 模式下创建回调方法时,因为它使代码更易读。块中的代码应该缩进 4 个空格。

取决于块的长度,下列都是合理的风格准则:

  • 如果一行可以写完块,则没必要换行。

  • 如果不得不换行,关括号应与块声明的第一个字符对齐。
    块内的代码须按 4 空格缩进。

  • 如果块太长,比如超过 20 行,建议把它定义成一个局部变量,然后再使用该变量。

  • 如果块不带参数,^{ 之间无须空格。如果带有参数,^( 之间无须空格,但 ) { 之间须有一个空格。

  • 块内允许按两个空格缩进,但前提是和项目的其它代码保持一致的缩进风格。

// The entire block fits on one line.
[operation setCompletionBlock:^{ [self onOperationDone]; }];

[operation setCompletionBlock:^{
    [self.delegate newDataAvailable];
}];


dispatch_async(fileIOQueue_, ^{
    NSString* path = [self sessionFilePath];
    if (path) {
      // ...
    }
});


[[SessionService sharedService]
    loadWindowWithCompletionBlock:^(SessionWindow *window) {
        if (window) {
          [self windowDidLoad:window];
        } else {
          [self errorLoadingWindow];
        }
    }];

// An example where the parameter wraps and the block declaration does
// not fit on the same line as the name.
[[SessionService sharedService]
    loadWindowWithCompletionBlock:
        ^(SessionWindow *window) {
            if (window) {
              [self windowDidLoad:window];
            } else {
              [self errorLoadingWindow];
            }
        }];

// Large blocks can be declared out-of-line.
void (^largeBlock)(void) = ^{
    // ...
};
[operationQueue_ addOperationWithBlock:largeBlock];

1.8 枚举类型

【建议】当使用enum时,推荐使用新的固定基本类型规格,因为它有更强的类型检查和代码补全。现在SDK有一个宏NS_ENUM()来帮助和鼓励你使用固定的基本类型。

typedef NS_ENUM(NSInteger, RWTLeftMenuTopItemType) {
  RWTLeftMenuTopItemMain,
  RWTLeftMenuTopItemShows,
  RWTLeftMenuTopItemSchedule
};

1.9 Case语句

【建议】大括号在case语句中并不是必须的,除非编译器强制要求。当一个case语句包含多行代码时,大括号应该加上。

switch (condition) {
  case 1:
    // ...
    break;
  case 2: {
    // ...
    // Multi-line example using braces
    break;
  }
  case 3:
    // ...
    break;
  default: 
    // ...
    break;
}

有很多次,当相同代码被多个cases使用时,一个fall-through应该被使用。一个fall-through就是在case最后移除’break’语句,这样就能够允许执行流程跳转到下一个case值。为了代码更加清晰,一个fall-through需要注释一下。

switch (condition) {
  case 1:
    // ** fall-through! **
  case 2:
    // code executed for values 1 and 2
    break;
  default: 
    // ...
    break;
}

当在switch使用枚举类型时,’default’是不需要的。例如:

RWTLeftMenuTopItemType menuType = RWTLeftMenuTopItemMain;
switch (menuType) {
  case RWTLeftMenuTopItemMain:
    // ...
    break;
  case RWTLeftMenuTopItemShows:
    // ...
    break;
  case RWTLeftMenuTopItemSchedule:
    // ...
    break;
}

猜你喜欢

转载自blog.csdn.net/oXiMing1/article/details/49027695
今日推荐