代码格式

1.空格

1)代码缩进:在”空格“和”Tab“之中,选择使用”Tab“进行代码缩进。并在Xcode中"Text Editing"设置Tab和自动缩进都设置为4个空格;

2)每行最大宽度为80列,超过80必须换行:在Xcode中"Page guide at column"设置为80;

3)对象类型与*之间有一个空格,*应靠近右侧的第一个字符:

错误写法:

NSString* name = @"hori";
static NSString* const HoriLoginAccount = @"1234";

正确写法:

NSString *name = @"hori";
static NSString *const HoriLoginAccount = @"1234";

4)如果须用符号,分隔的两个字符,,应紧靠左侧第一个字符,并加上一个空格:

错误写法:

NSArray *array = @[@1 ,@2];
NSArray *array = @[@1 , @2];

正确写法:

NSArray *arry = @[@1, @2];

5)如果]后面还有关键字,则须留一个空格:

错误写法:

UITableView *tableView = [[UITableView alloc]init];

正确写法:

// ]后面还有关键字,须留有一个空格;
// ]后面没有关键字,则不需要空格
UITableView *tableView = [[UITableView alloc] init];

6)方法名最后一个字符和{之间留一个空格:

错误写法:

- (void)methodName{
    // code
};

正确写法:

- (void)methodName {
    // code
}

7)(左侧和)右侧须留有一个空格:

错误写法:

if(){
}

switch(){
}

正确写法:

if () {
}

switch () {
}

8)逻辑运算符和算术运算符的左右都须留一个空格

错误写法:

UITableView *tableView=[[UITableView alloc] init];

if (object.name.length>10) {

}

正确写法:

UITableView *tableView = [[UITableView alloc] init];

if (object.name.length > 10) {

}

9)三目运算符中的?:左右两边都须留一个空格;如果左侧逻辑判断代码过多,则用()括起来

错误写法:

NSString *name = !person.name?@"hori":persion.name;

BOOL adult = person.age >= 18 ? YES : NO;

正确写法:

NSString *name = !person.name ? @"hori" : persion.name;

// 逻辑判断代码过多,使用()括起来
BOOL adult = (person.age >= 18) ? YES : NO;

2.花括号

方法名或者判断语句后的{不可另起一行:

错误写法:

- (void)methodName
{
    if ()
    {
        // code
    }
    else if ()
    {
        // code
    }
    else 
    {
         // code   
    }
}

正确写法:

- (void)methodName {
    if () {
        // code
    } else if () {
        // code
    } else {
        // code 
    }
}

3.方法的书写

1)方法名和参数都在一行

  • -(之间有一个空格;

  • {位置:方法名的末尾 + 一个空格;

  • }独占一行。

正确的写法:

- (NSString *)phoneNumbeWithRecord:(HoriSipRecord *)sipRecord {
    // code
}

2)如果方法名过长,以:来对齐分行显示:

- (void)selectRowAtIndexPath:(nullable NSIndexPath *)indexPath 
                    animated:(BOOL)animated 
              scrollPosition:(UITableViewScrollPosition)scrollPosition {
    // code
}

3)分行时,如果第一段名称过短,后续名称可使用一个Tab为单位缩进:

- (void)monitorCell:(HoriMonitorCell *)monitorCell 
    didClickMonitorWithPhoneBookRecord:(HoriSipPhoneBookRecord *)phoneBookRecord
                                   row:(NSUInteger)row {
    // code   
}

4)分行时,当关键字的长度不足以以冒号对齐时,下一行都要以一个Tab缩进:

- (void)short:(NSString *)theString
    longKeyword:(CGRect)theRect
    eventLongerKeyword:(float)theInterval {
    // code
}

5)方法内部的第一行代码不需要空行:

错误写法:

- (void)setupNavigationItem {

    // 内部第一行代码不需要空行
    self.navigationItem.title = @"首页";
}

正确写法:

- (void)setupNavigationItem {
    self.navigationItem.title = @"首页";
}

4.方法的调用

其实和方法的书写类型

1)写在一行:

[self.object phoneNumbeWithRecord:sipRecord];

2)分行写,以:对齐分行显示:

[self.delegate selectRowAtIndexPath:indexPath
                           animated:YES
                     scrollPosition:nil];

3)第一段名称过短,后续名称使用Tab为单位缩进:

[self.delegate monitorCell:cell
    didClickMonitorWithPhoneBookRecord:phoneBookRecord
                                   row:row];

4)关键字的长度不足以以冒号对齐时,下一行都要以一个Tab进行缩进

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

5.协议(Protocol)

@interface UITableView : UIScrollView <NSCoding, UIDataSourceTranslating>

@property (nonatomic, weak) id <UITableViewDelegate> delegate;

@end
  • <>括起来的协议和类型名之间有一个空格;
  • 多个协议之间,前一个协议名紧跟,,然后再有一个空格;
  • 声明协议属性时,使用id修饰对象,id<>之间有一个空格;
  • <>属性名之间有一个空格。

6.闭包/块(Block)

  • 如果一行可以写完,则没必要换行;
  • 如果不得不换行,}应与块声明的第一字符对齐;
  • 块内代码必须一个Tab缩进;
  • 如果块太长,比如超过20行,建议把它定义成一个局部变量,然后再使用该变量;
  • 如果块不带参数,^{之间无须空格。如果带有参数,^(之间无须空格,但){之间必须有一个空格;
// 1.在一行能写完的block
[operation setCompletionBlock:^{ [self onOperationDone]; }];

// 2.需要多行写完的block,快内代码使用一个Tab缩进,}应与块声明的第一个字符对齐
[operation setCompletionBlock:^{
    [self.delegate newDataAvailable];
}];

// 3.使用block的C语音API时,规格和Objective-C规则一样
dispatch_async(self.fileIOQueue, ^{
    NSString *path = [self sessionFilePath];
    if (path) {
        // code
    }
});

// 4.如果block的名字过长,则另取一行(block名字和参数在同一行)
// }与block名字的第一个字符对齐
[[SessionService sharedService] 
    loadWindowWithCompletionBlock:^(SessionWindow *window) {
        if (window) {
            [self windowDidLoad:window];
        } else {
            [self errorLoadWindow];
        }    
    }];

// 5.如果block的名字过长,则另取一行(block名字和参数在不在同一行)
// }与^对齐
[[SessionService sharedService] 
    loadWindowWithCompletionBlock:
        ^(SessionWindow *window) {
            if (window) {
                [self windowDidLoad:window];
            } else {
                [self errorLoadWindow];
            }    
        }];

// 6.如果块太长,建议定义成一个局部变量
void (^largeBlock)(void) = ^{
    // code
};
[self.operationQueue addOperationWithBlock:largeBlock];

// 7.一个调用使用多个block时,使用一个Tab缩进对齐
[[SessionService sharedService] 
    setCompletionSuccessBlock:^(successBlock) {
        // code
    } 
    faileBlock:^(faileBlock) {
        // code
    }];
  • 对常用的块类型创建typedef需要注意:
/*
    1.返回值与(之间没有空格;
    2.)和(之间有一个空格
*/
typedef int(^HoriSomeBlock) (BOOL flag, int value);

7.多用字面量语法

语法糖创建方式

1)字面数值:

少用:

NSNumber *someNumber = [NSNumber numberWithInt:1];

多用:

NSNumber *someNumber = @1;

2)字面量数组:

少用:

NSArray *animals = 
    [NSArray arrayWithObjects:@"cat", @"dog", @"mouse", @"badger", nil];

NSString *dog = [animals objectAtIndex:1];

NSMutableArray *mutableArray = [NSArray arrayWithObjects:@"cat", @"dog", @"mouse", @"badger", nil];
[mutableArray replaceObjectAtIndex:1 withObject:@"dog"];

多用:

NSArray *animals = @[@"cat", @"dog", @"mouse", @"badger"];
NSString *dog = animals[1];

NSMutableArray *mutableArray = [@[@"cat", @"dog", @"mouse", @"badger"] mutableCopy];
mutableArray[1] = @"dog";

3)字面量字典

少用:

NSDictionary *person = 
    [NSDictionary dictionaryWithObjectsAndKeys:
        @"Matt", @"firstName",
        @"Galloway", @"lastName",
        [NSNumber numberWihtInt:28], @"age",
        nil];

NSString *lastName = [person objectForKey:@"lastName"];

多用:

NSDictionary *person = @{
      @"firstName" : @"Matt",
      @"lastName" : @"Galloway",
      @"age" : @28
};

NSString *lastName = person[@"lastName"];
书写规范
  • []{}两端无须空格;
  • 如果构造代码不写在一行内,构造元素须使用一个Tab来缩进,]或者}写在新的一行,并与调用语法糖那行代码的第一个非空字符对齐;
  • 创建字典时,key和value与中间的:都须留一个空格。多行书写时,也可将每个value对齐。

错误写法:

// 冒号的左侧只能留有一个空格,冒号右侧才可以考虑是否按照value对齐
NSDictionary *wrongDictionary = @{
    @"firstName"   : @"Matt",
    @"age"         : @28,
};

// 冒号左侧须留一个空格
NSDictionary *wrongDictionary = @{
    @"firstName": @"Matt",
    @"age":  @28,
};

正确写法:

// []或{}两端无须空格
NSArray *array = @[@"haha", @1, @"pas"];
NSDictionary *dictionary = @{@"fisrtName" : @"hori"};

// 冒号左右侧各有一个空格
NSDictionary *dictionary = @{
    @"firstName" : @"Matt",
    @"age" : @28
};

// 以最长的为基准,最长的:左右个一个空格,
// 其他的冒号和最长的冒号对齐
NSDictionary *dictionary = @{
    @"lastName"  : @"haha",
    @"firstName" : @"Matt",
    @"age"       : @28
};

results matching ""

    No results matching ""