iOS代码规范
代码规范
遵循原则:见文知意、清晰简洁、无错。
包括:
命名规范
代码规范
注释规范
项目规范
1、命名规范
类名首字母大写,方法首字母小写,方法中的参数首字母小写,同时尽量让方法的命名读起来像一句话,能够传达出方法的意。
原则:见文知意。
1)类名命名
采用大驼峰法则,即每个单词的首字母采用大写字母。
格式:前缀+名字+类型
前缀:大写,例如GG
,用于修饰
类型:用于表明类的范围的,继承NSObject
的类可不写
例如:
GGDemoView:前缀:GG,名字:Demo,类型:View
2)变量命名
采用小驼峰法则,第一个单词的首字母小写,后面单词的首字母全部大写。
例如:name,passWord。
3)常量命名
采用大驼峰法则,前缀加小k。
例如:NSString *kPersonName = @”abc”;
4)宏命名
采用大驼峰法则。
例如:#define AppKey @"1235"
5)方法命名
采用小驼峰法则,第一个单词的首字母小写,后面单词的首字母全部大写。同时,尽量让方法名读起来像是一句话,能够清晰的传达方法要表达的意思。
例如:
- (instancetype)initWithFrame:(CGRect)frame;
- 取得某个对象,以名词作为方法的开头;
例如:
- (UIImage *)imageName:(NSString *)name;
- 表示执行某操作,以动词作为方法的开头,get、make、set等;
例如:
- (void)setupData;
- 如果方法有参数,每个参数前最好有参数提示;
例如:
- (instancetype)init:(CGRect)frame; //糟糕的方法命名
- (instancetype)initWithFrame:(CGRect)frame; //好的方法命名
- 如果方法有多个参数,不需要用
and
连接;
例如:
- (instancetype)initWithFrame:(CGRect)frame andTitle:(NSString *)title; //不是很好
- (instancetype)initWithFrame:(CGRect)frame title:(NSString *)title; //好
- 返回
BOOL
值在方法前加前缀is
、has
。
例如:
- (BOOL)isEqualToString:(NSString *)aString;
2、代码规范
原则:有条理,层次清晰
1)属性、变量的声明
- 属性、变量声明
属性声明格式:@property(nonatomic, 关键字) + 1空格 + 类型 + 1空格 + *名称;
例如:
@property(nonatomic, strong) NSString *name;
特点:类型跟星号之间有一个空格,星号紧跟变量名称,括号内的参数列表,逗号紧跟前一个参数再空格接下一个参数。
注意:此格式适用于继承自NSObject类的类型,对于基本数据类型的属性/变量只是没有“*”的区别。
- 属性的使用
请使用self.
的方式应用类的成员变量,不推荐使用_变量名
的方式。
例如:
推荐使用self.的方式:
self.tableView.delegate = self;
self.tableView.dataSource = self;
不推荐如下的方式:
_tableView.delegate = self;
_tableView.dataSource = self;
2)方法
- 方法声明的规范
格式:-/+ + 空格 (类型)方法名;
特点:-/+与返回类型之间有个空格,参数的类型用括号括起,参数之间有一个空格。
例如:
- (instancetype)initWithFrame:(CGRect)frame;
- (instancetype)initWithFrame:(CGRect)frame type:(int)type;
- 方法实现
特点:除上面的2)方法声明的规范外,
1)在方法的结尾处加一个空格,然后紧跟大括号“{”;
2)方法与方法之间空一行。
例如:
- (instancetype)initWithFrame:(CGRect)frame type:(int)type {
}
//方法与方法之间空一行
- (void)viewDidLoad {
[super viewDidLoad];
}
3)变量与方法声明的位置
对于私有变量、私有方法的声明,请把它们放在.m文件中。区别是不是私有,原则就是这个变量或方法要不要在别的地方使用,若是不要,就不要在.h文件中声明了,在.h文件中声明的就是公开。
4)操作符前后用1个空格隔开。
例如:
推荐写法:
NSString *str = @"123456";
NSInteger num = 2;
BOOL flage = num > 1;
str = flage ? @"1" : @"0";
这样写程序没有对与错,只是给人感觉有点凌乱:
NSString*str =@"123456";
NSInteger num=2;
BOOL flage=num>1;
str = flage?@"1":@"0";
5)代码缩进
1)使用xcode默认缩进,即tab = 4space
,快捷键:左缩进commend+[
,右缩进commend+]
;
2)xcode也提供格式化功能,选中代码,快捷键:control+i
。
6)判断nil
或YES
/NO
推荐写法:
if (someObject) { ... }
if (!someObject) { ... }
避免如下写:
if (someObject == YES) { ...}
if (someObject != nil) { ...}
理由:if (someObject == YES)容易误写成赋值语句, if (someObject)写法也很简洁。
7)可变类型的变量要初始化
对于mutale
类型的成员变量,如NSMutableArray
、NSMutableDicyionary
,先要完成初始化,再使用,没有初始化的话这个变量是为nil的。
8)block
使用block
块,要弱引用对象,避免循环引用。使用关键字__weak
或__block
,__block
可以修饰对象也可修饰基础数据类型的变量,__weak
只能修饰对象。
规范写法如下:
__weak typeof(self) weakSelf = self;
myObj.myBlock = ^{
__strong typeof(self) strongSelf = weakSelf;
if (strongSelf) {
[strongSelf doSomething]; // strongSelf != nil
// preemption, strongSelf still not nil
[strongSelf doSomethingElse]; // strongSelf != nil
}
else {
// Probably nothing...
return;
}
};
9)移除通知
注册了observer
,记得移除它,不限移除时间,但要保证在对象销毁前移除它,建议在dealloc
方法中将observer
移除。
10)避免硬编码
死值每次修改的时候容易被遗忘,也不方便查找、修改,另外仅仅看到一个数字,完全不知道这个数字代表的意义。可以采用动态获取,定义枚举、定义常量(知道含义)的方式。
例如:
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 2; //应尽量避免使用具体的数值,除非是很明确的情况下
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return self.array.count; //这种方式比写具体值方便多了。
}
11)对象判空(nil)处理
对于外部传过的参数(特指对象)建议先进行空判断,避免不必要的错误,尤其是跟网络相关的数据(有可能json解析出来为空)。
提示:NSArray、NSDictionary类型的对象是不能添加nil数据的。
3、注释规范
注释方法有单行多行注释,按需求选择。单行注释的快捷键:commend+/。
1)变量注释
2)方法注释
方法定义必须注释清楚用途、入参出参含义、要求,建议使用VVdocumenter插件;
备注:xcode 8以后,会发现常用的注释插件VVdocumenter无法使用了。其实它是被Apple采纳了,融合到了xcode中了。快捷键:option+commend+/
。(注意:光标要位于具体的方法处才有效)
3)类描述
类名最好能描述清楚自身是干什么用的,在头文件的注释中增加一行描述;
4)pragma mark
代码要按功能模块分块,用#pragma mark – name
进行分组;
4、项目规范
1)项目的目录结构
一个合理的目录结构首先应该是清晰的,让人一眼看上去就能大概了解目录的职责,且容易应对新的变化。
在我们的项目中主目录按照模块分类,内目录按业务分类的方式。我们在xcode看到了目录结构,也要保证文件在磁盘中的存储结构也是如此的,方便查找、也方便管理。例如,在xcode创建了一个model目录,当向model目录中添加文件时,确保文件的存储位置是在model这个文件夹下。
2) 项目文件命名规范
采用大驼峰法则。但是不限使用中文标注,中文标注建议用小括号括起来。
例如:Tools(工具)
3)操作上的建议
1)按照目录层次来放置文件,建立子目录。
网友评论