一、目的

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

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

二、命名规范

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

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

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

2.1 项目命名

项目名都遵循大swiftly驼峰swift系统命名。例如:AoRiseProject

2.2 Bundle Identifier 命名

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

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

2.3 类名

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

例如:KQ + Login + ViewController

常用控件类命名类型对照表(下表中前缀为:KQ,如果用到下表中没有列举swift制裁出来,请去掉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 参数名

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

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 文件夹命名

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

四、第三方库规范

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

项目使用cocoapods统一管理开源第三库文件,不需要手动导入和手动添加依赖库。如果第三方不支持coc苹果8oapods,可手动效率高发票查验导入工程。

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

五、注释规范

为了代码规范减少他人阅读你代苹果x码的痛苦值,请在关键地方做好注释苹果8plus

5.1 类注释

 //
  // KQTestViewController.swift
  // KangYunYouJia
  //
  // Created by zhouxiang on 2020/12/1.
  // Copyright  2020 zhoux@zzkqdc.com. All rights reserved.
  //

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

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中的每个苹果12字段代表的意思,用来做什么苹果12事情的。

  @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等。

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

   /// 小区名 
   @property (strong, nonatomic, nullable) NSString *communityName; 
  • 遵循一般变量泵码规范,多模仿苹果API。

  • 变量与函数除不用的代码。

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

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

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

七、其它规范Swift

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

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

  • 尽可能的使用局部变量

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

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

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

– 控制效率的拼音实例的产生,以达到节约资源的目的。

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

  • 最后不要忘了检测内存泄漏。