代码格式
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
};