整理自https://github.com/raywenderlich/objective-c-style-guide
http://wing-of-war.github.io/ios/2014/11/10/Raywenderlich-Objective-C-style-guide-CN.html
语言:使用美式英语 myColor>myColour(大于号代表优于)
代码组织:
- 使用
#pragma mark -
把相同的代码放在同一代码区中 - 保持
.h
和.m
文件内的代码块一只与顺序一致 - 如果有次分组,使用
pragma mark
划分子代码区
空格:
- Xcode默认换行是4个空格,推 荐使用2个空格,让代码看起来更紧凑,设置方法:xcode->preferences->Text Editing->Indentation->Indent width。
- 方法体{}的开始{与方法和if/else/switch/while控制流方法处于同一行,}则需要另起一行。
- 方法之间应该保持一个空行,有助于保持清晰的结构。
- 推荐使用auto-property-synthesis自动生成属性的Set,Get方法;
- 如果需要,每一个@synthesize 和 @dynamic都应该独占一行。
- 多个回调模块,使用{}括号的对齐比使用 方法名中的:对齐要便于阅读。
// blocks are easily readable
[UIView animateWithDuration:1.0 animations:^{
// something
} completion:^(BOOL finished) {
// something
}];
注释: 及时更新;复杂的地方才加注释;代码如注释;
命名规范:
- 鼓励使用完整,并且有描述性的变量名和方法;
- 三个首字母的缩写仅用于类名和常量之中(并且大写);
- 常量应以相关类作为前缀+RWTTutorialViewControllerNavigationFadeAnimationDuration>fadetime(原文如此,但是我觉得太长)
- 使用自动变量赋值方法,而不是自己实现@synthesize。
属性:
- 属性应以驼峰命名
- 除了init初始化方法中使用_variableName来获取或者设置值之外,都应该使用self.来获取变量,实例中的值。
- 本地变量不应该包含下划线。
方法:
- 方法名和方法类型
(-/+)
之间有一个空格。 - 方法片段间有空格。
- 多个参数名前的方法要有描述性的关键字,并且不要包含and字段。
- (id)viewWithTag:(NSInteger)tag;
变量:
- 除了在流控制方法中的临时变量,变量名应该是有一定描述性的。
- *与变量名紧靠在一起。
- 除init,dealloc,set,get等此类方法,应该尽量使用setters和getters。
Preferred:
@interface RWTTutorial : NSObject
@property (strong, nonatomic) NSString *tutorialName;
@end
Not Preferred:
@interface RWTTutorial : NSObject {
NSString *tutorialName;
}
Property属性:
- 变量申明时,原子属性在存储之后(和IB拖线保持一致)。
- 经常变更(NSMutable*)的变量更倾向于使用copy,而不是strong。
点表达式:
- 点表达式应该是用于获取或者改变属性
- 其它实例方法,都推荐使用[]括号记法。
[self.array count]>self.array.count
字面量:
NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul"];
NSDictionary *productManagers = @{@"iPhone": @"Kate", @"iPad": @"Kamal", @"Mobile Web": @"Bill"};
NSNumber *shouldUseLiterals = @YES;
NSNumber *buildingStreetNumber = @10018;
常量:
- 常量使用static与const创建,#define可以用于定义便利方法。
枚举类型:
- 传统的枚举则让代码看起来更像C。
- 推荐使用代码提示中宏定义的NS_ENUM()枚举模块来创建,它可以提供更严谨的类型检测和代码补完功能。
typedef NS_ENUM(NSInteger, RWTLeftMenuTopItemType) {
RWTLeftMenuTopItemMain,
RWTLeftMenuTopItemShows,
RWTLeftMenuTopItemSchedule
};
分支:
- 每一个case分支下的执行语句,如果只有一行,不加{};
- 如果case分支下的执行语句有多行,则使用{}划定范围。
- 相同case分支的条件使用条件继承 fall-through,在上层case中不使用break跳出,直接继承下层case的执行语句。
- default条件非必需
私有属性:
- 私有变量应该在类的私有类别中,不需要加private等词语来进行修饰。
私有类别可以在命名为+Private.h的文件里提供
@interface RWTDetailViewController ()
@property (strong, nonatomic) GADBannerView *googleAdView;
@property (strong, nonatomic) ADBannerView *iAdView;
@property (strong, nonatomic) UIWebView *adXWebView;@end
布尔类型:
- Objective-C使用YES/NO;在CoreFoundation,C和C++中使用true/false
- 不要把对象直接和YES进行比较
- 可以覆写类继承自NSOjbect下的-(BOOL)isEqual:(id)obj;方法来类的比较。
- 如果BOOL变量是形容词,不需要is来进行修饰。
条件:
- 一定使用{}来划定判断后的执行语句;
- 即使执行语非常简单,也不能与条件判断在一行。
三元运算符:
- 只有在确定能够促进代码整洁与清晰的前提下才使用。
- 三元运算符最好在赋值需要判断时使用。
- 非BOOL类型变量必须要与其类型变量做出判断后才能使用。
result = a > b ? x = c > d ? c : d : y;
不推荐
初始化方法:
- init方法中返回值使用instancetype取代id作为返回。
- 构造方法同上
CGRect方法:
- 使用CGGeometry方法来获取CGRect结构下的长宽位置值。
Preferred:
CGRect frame = self.view.frame;
CGFloat x = CGRectGetMinX(frame);
CGFloat width = CGRectGetWidth(frame);
CGRect frame = CGRectMake(0.0, 0.0, width, height);
Not Preferred:
CGRect frame = self.view.frame;
CGFloat x = frame.origin.x;
CGFloat width = frame.size.width;
CGRect frame = (CGRect){ .origin = CGPointZero, .size = frame.size };
黄金路径(Golden Path):
- 条件判断的左侧空间被称为黄金路径或者幸福路径;
- 减少if的条件的嵌套,扁平化多个返回条件。
- 函数的多个返回条件是可以接受的。
错误处理:
- 条件判断错误时,应该是错误变量本身。
单例:
- 必须线程安全。
笑脸:
使用:]
看起来比:)
笑得更开心