美文网首页
iOS代码规范

iOS代码规范

作者: 李小南 | 来源:发表于2020-05-01 21:05 被阅读0次

    1.代码规范

    • 使用驼峰命名
    • 不允许直接声明和使用实例变量,应当使用属性变量
      错误:
    @interface object {
        NSString *_name;
    }
    @end
    

    正确:

    @interface object
    @property (nonatomic, strong) NSString *name;
    @end
    

    1.1UIViewController

    1.1.1 统一代码布局

    严格按照以下顺序组织viewController中的代码:

    #pragma mark - life cycle
    #pragma mark - public methods
    #pragma mark - [系统控件的Protocol]
    #pragma mark - [自定义控件的Protocol]
    #pragma mark - [core相关的Protocol]
    #pragma mark - event response
    #pragma mark - private methods
    #pragma mark - getters and setters

    其中,[系统控件的Delegate][自定义控件的Delegate] 需要替换成对应的真实Delegate名字。这样在Xcode中按住command键点击对应的pragma,就能跳转到Delegate的定义处。
    示例:

    #pragma mark - life cycle
    #pragma mark - public methods
    #pragma mark - UICollectionViewDelegate
    #pragma mark - UICollectionViewDataSource
    #pragma mark - XCSendGiftViewDelegate
    #pragma mark - AuthCoreClient
    #pragma mark - RoomCoreClient
    #pragma mark - event response
    #pragma mark - private methods
    #pragma mark - getters and setters
    

    1.1.2 尽量不要有私有方法

    一般来说设计得好的ViewController是不会有私有方法的,消除私有方法的方式有两种:

    1. 把私有方法抽出放入Category
    2. 把可复用的私有方法抽出做成工具类

    1.1.3 管理好头文件引用

    1. 通过换行来将引用的头文件归类(按照功能归类, 不同功能之间空一行)
    // vc
    #import "YDLoginViewController.h"
    #import "YDRegisterViewController.h"
    
    // view
    #import "XC_MSAuthEditView.h"
    
    // core
    #import "AuthCore.h"
    #import "AuthCoreClient.h"
    
    // tool
    #import "XCTheme.h"
    #import "XCMacros.h"
    #import "UIImage+Utils.h"
    
    // other...
    #import <Masonry/Masonry.h>
    
    1. 禁止引用不使用的头文件
    2. 第三方Pod的头文件引用全部用<>
      #import <AFNetworking/AFNetworking.h>

    1.1.4 viewDidLoad中(同样适用于view的 initWithFrame: 方法)

    • initView 方法, 添加子类
    • initConstrations 添加约束
    • addCore 添加协议代理
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        [self initView];
        [self initConstrations];
        [self addCore];
    
        // ...
    }
    

    1.2 命名规范

    1.2.1 变量名、函数名

    1.2.1.1 变量名

    • 使用驼峰命名法
    • 不用知道上下文,光看变量名就能知道这个变量是干什么的
    • 不用知道上下文,光看变量名就能知道这个变量是什么类型
      • UIView系列的全部以View结尾
      • UIButton系列的全部以Button结尾
      • UIGestureRecognizer系列的全部以Recognizer结尾
      • UIViewController系列的全部以ViewController结尾
      • 以此类推

    1.2.1.2 函数名

    • 不用知道上下文,光看函数名就能知道这个函数是干什么的
    • 不用知道上下文,光看函数名就能知道这个函数会在什么时候被调用
    • -/+ [空格] [返回类型] [函数名]

    错误:
    -(void)functionName;
    -(void) functionName;
    - (void) functionName;

    正确:
    - (void)functionName;

    1.2.2 Notification名

    • k + 发送者名 + 事件名 + Notification

    k UIApplication WillTerminate Notification
    k LoginManager DidLoggedIn Notification

    1.2.3 Delegate函数名

    delegate方法四要素:

    1. 返回类型
    2. 自己
    3. 事件
    4. 反馈参数

    - (void)manager:(XXManager *)manager didFailedWithErrorCode:(NSString)errorCode errorMessage:(NSString *)errorMessage;

    - (void)managerTaskDidFinished:(XXManager *)manager;

    delegate方法第一个参数永远都应该是自己。(重要)

    1.2.4 enum/option名

    enum/option类型名:

    类名 + XXX Type/Style

    YDBoxMainViewEventType

    enum/option 值名:

    enum/option类型名 + 具体的内容

    XCBoxMainViewEventTypeClose
    XCBoxMainViewEventTypeHelp
    XCBoxMainViewEventTypeRecode

    1.2.5 事件响应函数名

    1.2.5.1 Notification响应函数名

    统一使用didReceive开头,后面跟Notification的名字。

    - (void)didReceive[Notification名]:(NSNotification *)notification;

    1.2.5.2 UIButton响应函数名

    统一使用didClicked开头,后面跟Button的名字。

    - (void)didClicked[Button名]:(UIButton *)button;

    1.2.5.3 UIGestureRecognizer响应函数名

    统一使用didRecognized开头,后面跟recognizer的名字。recognizer的名字需要体现出具体的手势,例如滑动手势就应该命名为[页面名]SwipeGestureRecognizer

    - (void)didRecognized[GestureRecognizer名]:(UIGestureRecognizer *)recognizer;

    1.2.6 图片命名

    全部小写,统一使用组件名+功能。如:room_close.png, room_gift_send. 按照文件夹划分
    注意: 不允许图片拖进项目后, 直接在Xcode中直接双击重命名

    1.3 文件目录结构规范

    文件目录结构样例:MVVM, MVC

    1.3.1 每一个Group都有对应的文件夹

    Group需要和文件路径上一致,这样子便于代码文件的迁移。同时,在项目工程中也比较容易定位。

    1.3.2 目录层级关系可以表达调用关系或依赖关系

    这么做便于了解某一个对象或者模块,都需要哪些辅助文件。也便于后续做代码复用和拆分。

    1.3.3 单个文件夹下最多只能有一个对象的源文件

    这一个对象必定是这个目录下的主要对象,这样才能使得文件结构主次分明。

    1.4 符号使用规范

    1.4.1 运算符号两边都要有空格

    错误:
    a+b
    a?b:c

    正确:
    a + b
    a ? b : c

    1.4.2 使用()来表达优先级

    1. 错误:

    2. a || !b && c

    3. 正确:

    4. ( a || b ) && ( c || d )

    1.4.3 {}的使用规范

    函数中{}换行

    错误:
    - (void)foo
    {
    ...
    }

    正确:
    - (void)foo {
    ...
    }

    if-else中{}不换行,else中的{}不换行:

    错误:
    if (foo)
    {
    ...
    }
    else
    {
    ...
    }

    if (foo) {
    ...
    }else{
    ...
    }

    正确:
    if (foo) {
    ...
    } else {
    ...
    }

    1.4.4 用换行分隔意群

    有的时候一个函数里面代码量比较大,但是这部分代码量又没有大到必须拆成多个函数的情况,就需要使用换行去分隔意群。所谓意群就是做同一件事情的几行代码。

    在大函数中,应该尽可能把做同一件事情的几行代码写在一起,然后作为一个意群,用空行分隔开。

    -  (void)viewWillLayoutSubviews {
      [super viewWillLayoutSubviews];
    
      [self.navigationView topInContainer:0 shouldResize:NO];
      [self.navigationView fillWidth];
      self.navigationView.ct_height = 64;
    
      [self.leftViewModel.tableView top:0 FromView:self.navigationView];
      self.leftViewModel.tableView.ct_width = 99 * SCREEN_WIDTH / 375;
      [self.leftViewModel.tableView leftInContainer:0 shouldResize:NO];
      [self.leftViewModel.tableView bottomInContainer:0 shouldResize:YES];
    
      [self.rightViewModel.tableView fill];
      [self.rightViewModel.tableView top:0 FromView:self.navigationView];
      [self.rightViewModel.tableView leftInContainer:99 * SCREEN_WIDTH / 375 shouldResize:YES];
      [self.rightViewModel.tableView bottomInContainer:0 shouldResize:YES];
    }
    

    1.4.5 泛型的使用

    如果容器类型里面的数据类型是确定的,一定要加上泛型:

    数组:
    @property (strong, nonatomic) NSMutableArray<NIMChatroomMember *> *list;
    字典:@property (strong, nonatomic) NSMutableDictionary<NSString *, ChatRoomMicSequence *> *micQueue;
    集合:@property (strong, nonatomic) NSSet<NIMChatroomMember *> *list;

    1.5 注释规范

    我们的注释规范就是尽可能多的注释!

    1. 属性名
    2. 方法声明(特殊方法实现)
    3. 枚举值

    3.2 Core

    3.2.1 使用方法

    3.2.1.1 文件结构

    —RoomMagic

    ——Model

    ———RoomMagicInfo

    ——Request

    ———HttpRequestHelper+RoomMagic

    ——RoomMagicCoreClient

    ——RoomMagicCore

    5. 第三方的引用

    5.1 引用规范

    • 评估之后引用, iOS群里大家讨论. 同意后方可引入
    • 引入建议使用Pod, 如果不能给出理由
    • 引用的第三方需要封装一层才可使用(侵入性高的)
    • profile中需要指定引用的版本号

    6. podfile

    1. ########### 第三方Pods #########

    2. ############# 基础组件 ##############

    3. ############# 业务组件 ##############

    4. ############# 业务组件Category ##############

    相关文章

      网友评论

          本文标题:iOS代码规范

          本文链接:https://www.haomeiwen.com/subject/tefcghtx.html