iOS代码规范

作者: 东岳哥哥 | 来源:发表于2017-03-16 17:24 被阅读86次

    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值在方法前加前缀ishas
    例如:
        - (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)判断nilYES/NO

    推荐写法:

    if (someObject) { ... }
    if (!someObject) { ... }
    

    避免如下写:

    if (someObject == YES) { ...}
    if (someObject != nil) { ...}
    

    理由:if (someObject == YES)容易误写成赋值语句, if (someObject)写法也很简洁。

    7)可变类型的变量要初始化

    对于mutale类型的成员变量,如NSMutableArrayNSMutableDicyionary,先要完成初始化,再使用,没有初始化的话这个变量是为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)按照目录层次来放置文件,建立子目录。

    --养成一个良好的编程习惯 --

    相关文章

      网友评论

        本文标题:iOS代码规范

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