iOS开发规范

"良好的开发习惯,让代码容易阅读"

Posted by wanglilong on June 21, 2018

iOS开发规范

目的

为了利于项目维护以及规范开发,促进成员之间Code Review的效率,故提出以下开发规范,如有更好的建议,欢迎提出。

本文档的预期读者包括:iOS开发人员。

命名规范

代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。正确的英文拼写和语法可以让阅读者易于理解,避免歧义。

注意:即使纯拼音命名方式也要避免采用。但alibab、taobao、youku、hangzhou等国际通用的名称,可视同英文.

1
2
大驼峰规则:每个单词的首字母大写。例:NameTextField。
小驼峰原则:第一个单词首字母小写,其余都大写。例:nameTextField。

项目命名

项目名都遵循大驼峰命名。例如:AoRiseProject。

类名

类的命名都遵循大驼峰命名。一般是:前缀 + 功能 + 类型。例如:MW + Login + ViewController

控件名 类型 示例
UIViewController ViewController MWBaseViewController
UView View MWBaseView
UITableView TableView MWOrderTableView
UITableViewCell Cell MWOrderListCell
UIButton Button MWSuccessButton
UILabel Label MWSuccessLabel
UIImageView ImgView MWGoodsImgView
UITextField TextField MWNameTextField
UITextView TextView MWSuggestTextView

其它类相关对照表

功能 类型 示例
工具类 Tool MWOrderTool
代理类 Delegate MWOrderListDelegate
管理类 Manager MWOrderListModel
模型类 Model MWOrderListModel
Service类 Service MWOrderService
布局类 Layout MWHomeLayout
数据库类 DataBase、表名+DBHelper MWFriendDataBase、MWUserTableDBHelper
类目 XXX+(范围,例如Extension, Additions 或者功能,例如Frame,Nib,Block) MWUIButton+Additions、MWUIButton+Block

UIViewController书写规范

1
2
3
4
5
6
7
#pragma mark - life cycle
#pragma mark - event response
#pragma mark - UITableViewDelegate && UITableViewDataSource
(代理顺序往下排列)
#pragma mark - getters and setters
#pragma mark - private

注意:所有视图或者对象的创建请尽量使用懒加载,调用的时候全部使用self.textBtn这样的方式。如果是确定的不可变数组、字典,可直接给定数组中的元素。(getters and setters分类中,懒加载可出现_调用对象,其它情况请遵循self.调用原则)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#import "ViewController.h"

@interface ViewController ()
@property (nonatomic, strong)UIButton * textBtn;
@end

@implementation ViewController

#pragma mark - life cycle
- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addSubview:self.textBtn];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    
}
#pragma mark - private 

#pragma mark - event response

#pragma mark - UITableViewDelegate && UITableViewDataSource
//(代理顺序往下排列)

#pragma mark - CTAPIManagerCallBackDelegate

#pragma mark - getters and setters

- (UIButton *)textBtn
{
    if (_textBtn == nil) {
        _textBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        _textBtn.frame = CGRectMake(300, 250, 100, 100);
        _textBtn.backgroundColor = [UIColor yellowColor];
        _textBtn.titleLabel.text = @"text";
        [_textBtn addTarget:self action:@selector(text) forControlEvents:UIControlEventTouchUpInside];
    }
    return _textBtn;
}
@end

变量和方法

变量和方法的命名都遵循小驼峰命名。例如:textVariableStr, - (void)textAction响应事件。

变量命名对照表(如果用到下表中没有列举出来,请去掉UI、NS遵循实际规则即可。或者一看就知道的通用简写)

方法命名对照表(方法多为动词或动名词)

功能 示例
- (id)initXX 初始化相关方法,使用init为前缀标识,如初始化布局-(id)initView
- (BOOL)isXX 方法返回值为boolean型的请使用is前缀标识
- (UIView *)getXX 返回某个值的方法,使用get为前缀标识
- (void)setXX 设置某个属性值或者相关数据
- (void)updateXX 更新数据
- (void)saveXX 保存数据
- (void)drawXX 绘制相关,使用draw前缀标识
- (void)clearXX 清除数据
- (void)XXXAction 响应事件,使用Action为后缀标识
- (void)loadData 加载数据(一般情况下VC中都会有这个方法)
- (void)loadMoreData 加载更多数据
- (void)setupUI 加载布局(一般情况下VC中都会有这个方法)

常量

宏:小写k+大驼峰 即为:#define kUserAgeKey @“ageKey”

全局常量:工程前+缀全大写,下划线隔开 即为:extern const NSString MW_USER_AGE_KEY

参数名

参数名以小驼峰命名,尽量参考苹果原生方法风格编写。尽量可读性好,看到方法名就知道这个方法是用来干什么的。参数应该避免用单个字符命名。例:- (void)setDataImageUrl:(NSString *)imageUrl name:(NSString *)nameStr content:(NSString *)contentStr

注释规范

为了减少他人阅读你代码的痛苦值,请在关键地方做好注释。

类注释

1
2
3
4
5
6
7
8
//
//  MyViewController.m
//  text
//
//  Created by mac on 2017/9/12.
//  Copyright © 2017年 mac. All rights reserved.
//

该注释是自动生成的,在xcode中设置即可。Created by 电脑用户名on 创建该文件的时间。Copyright 2017 后面的名字。具体可在xcode工程,Project Document中设置。这样便可在每次新建类的时候自动加上该头注释。

方法注释

方法注释,方法外部统一用option + command + /,方法内部统一用//注释。

1
2
3
4
5
6
7
/**
 测试
 */
- (void)text
{
    //测试按钮事件响应   
}

模型注释

每个model中的,包含的每个属性,都必须要写上相对应的注释,用///注释。阅读者一看这个model,就清楚知道model中的每个字段代表的意思,用来做什么事情的。

1
2
3
4
5
6
7
8
9
10
@interface DeliveryModel : NSObject
///提货劵所在商圈id
@property (nonatomic, assign) long long mallId;
///商圈全称
@property (nonatomic, copy) NSString *mallFullName;
///商圈简称
@property (nonatomic, copy) NSString *mallShortName;
///提货劵号
@property (nonatomic, copy) NSString *credentialsCode;
@end

如果不是model的属性,是其它类属性,需要注释,请按照model属性注释方式。

编码规范

  • 所有的方法之间空一行。
  • 所有的代码块之间空一行,删除多余的注释。
  • 所有自定义的方法需要给出注释。
  • 尽量使用懒加载,在控制器分类时有提及和要求,其它自定义类按照控制器格式分类,没有的分类不写即可。
  • 代码后的’{‘不需要独占一行,包括方法之后,if,switch等。
  • 必须要统一的要求,属性的定义请按照下图property之后,空一格,括号之后空一格,写上类名,空一格之后跟上*和属性名。
1
2
3
4
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) DeliveryModel *delivery;
@property (nonatomic, strong) DeliveryLookAdapter *lookAdapter;
@property (nonatomic, strong) DeliveryLookAPIManager *lookManager;
  • 遵循一般代码规范,多模仿苹果API。
  • 删除不用的代码。
  • 如果有方法一直不会用到,请删除(除工具类)。
  • 没有执行任何业务逻辑的方法,请删除或给予注释,删除多余的资。源或文件,添加必要的注释。
  • 比较大的代码块需要给出注释。

资源文件规范

资源文件命名

全部小写,采用下划线命名法,加前缀区分。所有的资源文件都需要加上工程前缀(小写形式)。 命名模式:可加后缀_small表示小图,_big表示大图,逻辑名称可由多个单词加下划线组成,采用以下规则:

用途_模块名_逻辑名称

用途_模块名_颜色

用途_逻辑名称

用途_颜色

说明 前缀(工程前缀示例MW) 示例
按钮相关 mw_btn_ mw_btn_home_normalmw_btn_red,mw_btn_red_big
背景相关 mw_bg_ mw_bg_home_headermw_bg_main
图标相关 mw_ic_ mw_ic_home_locationmw_bg_input
分割线相关 mw_div_ mw_ic_home_locationmw_bg_input
默认相关 mw_def_ mw_ic_home_locationmw_bg_input

文件夹命名

创建文件夹最好创建实体文件夹,找到工程目录,创建相应文件夹并拖入工程。文件夹命名使用相应模块结构分层的英文,首字母要大写。例:Model,View,Controller,Tool,Other,Service等等。

版本规范

采用A.B.C 三位数字命名,比如:1.0.2,当有版本更新的时候,依据下面的情况来确定版本号规范。

版本号 说明 示例
A.b.c 属于重大更新内容 1.0.2 -> 2.00
a.B.c 属于小部分更新内容 1.0.2 -> 1.2.2
a.b.C 属于补丁更新内容 1.0.2 -> 1.0.4

第三方库规范

开源库的选取,一般都需要选择比较稳定的版本,作者在维护的项目,要考虑作者对issue的解决,以及开发者的知名度等各方面。选取之后,一定的封装是必要的。

项目使用cocoapods统一管理开源第三库文件,不需要手动导入和手动添加依赖库。

iOS开发规范