iOS开发规范

·  阅读 4207

一、目的

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

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

二、命名规范

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

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

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

2.1 项目命名

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

2.2 Bundle Identifier 命名

Bundle Identifier:采用反域名命名规范,全部采用小写字母,以域名后缀+公司顶级域名+应用名形式命名。  

例如:com.公司名称( kangqiao ).service.guanjia

2.3 类名

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

例如:KQ + Login + ViewController。  

常用控件类命名类型对照表(下表中前缀为:KQ,如果用到下表中没有列举出来,请去掉UI首字母,遵循实际规则即可。)

| 控件名 | 类型 | 示例 |
|  ----  | ----  | ----  |
| UIViewController|ViewController|KQBaseViewController |
| UView |View |KQBaseView|
| UITableView |TableView |KQOrderTableView|
| UITableViewCell |Cell |KQOrderListCell|
| UIButton |Button |KQSuccessButton|
| UILabel |Label |KQSuccessLabel|
| UIImageView |ImgView |KQGoodsImgView|
| UITextField |TextField |KQNameTextField|
| UITextView |TextView |KQSuggestTextView|

其它类相关对照表

| 功能 | 类型 | 示例| 
|  ----  | ----  | ----  |
| 工具类| Tool| KQOrderTool| 
| 管理类| Manager| KQOrderManager| 
| 模型类| Model| KQOrderListModel| 
| 数据库类| DataBase、表名+DBHelper |KQFriendDataBase、KQUserTableDBHelper| 
| 类目| XXX+(范围,例如Extension, Additions 或者功能,例如Frame,Nib,Block)| KQUIButton+Additions、KQUIButton+Block| 

2.4 UIViewController请按照如下分类

 // 外部传入参数+@IBOutlet

// MARK: - life cycle

// MARK: - UI

// MARK: - events

// MARK: - private methods

// MARK: - UITableViewDataSource

// MARK: - UITableViewDelegate

(代理顺序往下排列)        

// MARK: - network

// MARK: - getters & setters

*注意:所有视图或者对象的创建请尽量使用懒加载,调用的时候全部使用self.testButton这样的方式。

import UIKit
class KQTestViewController: UIViewController {
    /// 用户Id
    public var userId: String?
    /// 头像
    @IBOutlet weak var headerImageView: UIImageView!
    // MARK: - life cycle
    override func viewDidLoad() {
        super.viewDidLoad()
        // 创建UI
        self.buildUI()
    }


    // MARK: - UI
    /// 创建UI
    func buildUI() {
        // 添加testButton
        self.view.addSubview(self.testButton)
        self.testButton.mas_makeConstraints { (make) in
            make?.top.mas_equalTo()(0)
            make?.left.mas_equalTo()(0)
            make?.right.mas_equalTo()(0)
            make?.bottom.mas_equalTo()(0)
        }
    }
    
    // MARK: - events

    /// test按钮点击

    /// - Parameter sender: 按钮

    @objc func testButtonClick(_ *sender: UIButton) {

    // 自我介绍

    let _ = self.introduction("jack")

    }

    // MARK: - private methods

    /// 自我介绍

    /// - Parameter name: 姓名

    /// - Returns: 结果
func introduction(_ name: String?) -> Bool {

if (name ?? "").count > 0 {
print("my name is \(name!)!")
return true
} else {return false}
}

    

    // MARK: - UITableViewDataSource
    // MARK: - UITableViewDelegate
// MARK: - network
// MARK: - getters & setters
private lazy var testButton: UIButton = {
let testButton = UIButton(type: .custom)
testButton.backgroundColor = .red
testButton.setTitle("测试", for: .normal)
testButton.addTarget(self, action: #selector(testButtonClick(_ *:)), for: .touchUpInside)*

return testButton

}()
}

2.5 变量和方法

变量和方法的命名都遵循小驼峰命名。  例如:  

testButton  
func testButtonClick(_ *sender: UIButton)响应事件。

2.6 常量

全局常量:工程前缀+全大写,下划线隔开 例如:  

let KQ_SCREEN_WIDTH

2.7 参数名

参数名以小驼峰命名,尽量参考苹果原生方法风格编写。尽量可读性好,看到方法名就知道这个方法是用来干什么的。例如:  

func setData(_ *imageUrl: String?,* _ name: String?, content: String?)

三、资源文件规范

3.1 资源文件命名

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

- 模块名\_用途_*逻辑名称*
- 模块名\_用途_*颜色*
- 用途_*逻辑名称*
- 用途_*颜色*

|说明|前缀(工程前缀示例KQ)|示例|
|  ----  | ----  | ----  |
 
|按钮相关|kq_btn_ |  如下:

kq_home_btn_normal、kq_home_btn_red、kq_btn_normal、kq_btn_red_big|

|背景相关|kq_bg_| 如下:
kq_home_bg_header、kq_bg_main|

3.2 文件夹命名

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

四、第三方库规范

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

项目使用cocoapods统一管理开源第三库文件,不需要手动导入和手动添加依赖库。如果第三方不支持cocoapods,可手动导入工程。

如第三方库需要修改,统一放在TheThirdLiabrary文件夹中。

五、注释规范

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

5.1 类注释

 //

    //  KQTestViewController.swift

    //  KangYunYouJia

    //

    //  Created by zhouxiang on 2020/12/1.

    //  Copyright © 2020 zhoux@zzkqdc.com. All rights reserved.

    //

   

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

5.2 方法注释

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

/// 自我介绍

    /// - Parameter name: 姓名

    /// - Returns: 结果

    func introduction(_ name: String?) -> Bool {

        if (name ?? "").count > 0 {

            print("my name is \(name!)!")

            return true

        } else {

            return false

        }

    }

   

5.3 模型注释

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

    @interface KQUnitModel : NSObject

    /// 小区名称

    @property (strong, nonatomic, nullable) NSString *communityName;

    /// 小区code

    @property (strong, nonatomic, nullable) NSString *communityCode;

    /// 区域id

    @property (strong, nonatomic, nullable) NSString *cellId;

    /// 区域名称

    @property (strong, nonatomic, nullable) NSString *cellName;

    /// 楼层列表

    @property (strong, nonatomic, nullable) NSArray <KQFloorModel*> *floorList;

    @end

    

    

    class KQUnitModel: NSObject {
        /// 小区名称
        var communityName: String?
        /// 小区code
        var communityCode: String?
        /// 区域id
        var cellId: String?
        /// 区域名称
        var cellName: String?
        /// 楼层列表
        var floorList: [KQFloorModel]?
    }

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

六、编码规范

  • 所有的方法之间空一行。

  • 所有的代码块之间空一行,删除多余的注释。

  • 所有自定义的方法需要给出注释。

  • 尽量使用懒加载(在控制器分类时有提及和要求,其它自定义类按照控制器格式分类,没有的分类不写即可。)

  • 代码后的’{‘不需要独占一行,包括方法之后,if,switch等。

  • 必须要统一的要求,属性的定义请按照property之后,空一格,括号之后空一格,写上类名,空一格之后跟上**和属性名。例如:*

      /// 小区名   

      @property (strong, nonatomic, nullable) NSString *communityName; 
  • 遵循一般代码规范,多模仿苹果API。

  • 删除不用的代码。

  • 如果有方法一直不会用到,请删除(除工具类)。

  • 没有执行任何业务逻辑的方法,请删除或给予注释,删除多余的资源或文件,添加必要的注释。

  • 比较大的代码块需要给出注释。

七、其它规范

  • 建议项目统一使用Masonry和xib结合的方式布局。不允许出现直接设置frame的情况。不建议使用纯storyboard开发。

  • 提取方法,去除重复代码。对于必要的工具类抽取也很重要,这在以后的项目中是可以重用的。

  • 尽可能的使用局部变量

  • 尽量减少对变量的重复计算。

  • 尽量在合适的场合使用单例。使用单例可以减轻加载的负担,缩短加载的时间,提高加载效率。但并不是所有的地方都适用于单例,简单来说单例主要适用于以下三个方面:

    - 控制资源的使用,通过线程同步来控制资源的并发访问。

    - 控制实例的产生,以达到节约资源的目的。

    - 控制数据的共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信。

  • 最后不要忘了检测内存泄漏。
分类:
iOS
标签:
分类:
iOS
标签:
收藏成功!
已添加到「」, 点击更改