iOS 代码规范

时间:2022-06-01 18:21:47

1 目的

统一规范XCode编辑环境下Objective-C、swift的编码风格和标准

2 适用范围

适用于所有用Objective-C,swift语言开发的项目。

3 编码规范

3.1 文件

  1. 项目文件必须使用一个有意义的名字且前缀以PRJ_。例如:XCcode中下拉刷新的项目文件被命名为’PRJ_PullDownRefresh.xcodeproj’。
  2. 对于文件的目录要按如下结构创建:
    • 建立Libraries文件夹,所有第三方库放入其中.(CocoaPods代替)
    • 建立Constants.h头文件,所有的常量定义于其中。Constants.h文件放入Main文件组里面
    • 项目中所有Group或者文件名称(图片名字等),不要使用汉字命名,尽量使用英文命名,国内特有名词可以使用拼音。

    • 项目中所有Group都需要在项目目录中存在一个真实的目录,Group 中的文件与真实目录中文件一一对应。
  3. 为了不影响阅读,一个类的代码行数尽量不要超过300行;一个方法尽量不要超过30行。有超过的在重构的时候想办法分解。

3.2 注释

  1. 注释可以采用’ /* */ ’和’ // ’两种注释符号,涉及到多行注释时,尽量使用’ /* */ ’。
  2. 对于一行代码的注释可放在前一行及本行上,不允许放在下一行,更不允许在一行语句的中间加入注释。
  3. 单元文件的文件头注释说明应按如下格式:
//
// ViewController.m
// 规范Demo
//
// Created by KongYu on 16/5/18.
// Copyright © 2016年 SLH. All rights reserved.
// // 功能描述:
// 修改记录:
// 张三 2016-05-19 改变tableView的headerView的布局
  1. 不必每行都加注释,在3~10行左右的段落做注释要好于每行都做注释,显而易见的代码不加注释。例如:
if (!returnValue) {//调用登录过程失败无用的注释
NSLog(@”登录失败”);
}
  1. 方法的注释建议使用Xcode插件VVDocument使用,变量注释使用/** */ (使用的时候可以看到注释), 如:
/**
* <#Description#>
*
* @param application <#application description#>
* @param launchOptions <#launchOptions description#>
*
* @return <#return value description#>
*/ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
return YES;
}

3.3 编码排版格式

  1. 代码的缩进应使用空格(SPACE),不能使用制表符(TAB),并且缩进以2个字符为单位。4个空格TAB
  2. 中括弧的每一个括弧在源程序中要单独占一行。例如
for (int i = 0; i < 10; i++) {
}
  1. 空格的使用
    • 关键字与其后的表达式之间要有空格,如: if (expr)或for (expo)
    • 单目操作符不应与它们的操作数分开(如’!’和’^’等)。
    • 除’ , ’外,其它双目操作符应与它们的操作数用空格隔开。例如
i=i+1;              //错误的写法,操作符两端没有空格
i = i + 1; //正确的写法,
if(a>b) //错误的写法,逻辑判断符号两端没有空格
if(a > b) //正确的写法
  • .h中协议<>前面有一个空格。
  • .h中成员声明时,类型与变量之间有至少1个空格。*号靠近变量,不靠近类型。
  • @property后留1个空格,()里面,逗号紧跟前一变量,与后一变量之间留1个空格。()外面,先留1个空格,再声明属性。
  • 方法的+,-后面与()之间留1个空格。
  • 返回类型与*之间留1个空格,方法参数中返回类型与*之间留1个空格。
  • 在多参数方法中,每个参数后面都有1个空格。
  1. 每行只能有一个语句
    //不正确写法
NSUInteger objectIndex, stuffCount;

@synthesizeMyView, MyLabelView; //正确写法
NSUIntegerobjectIndex;
NSUIntegerstuffCount;

@synthesizeMyView;
@synthesizeMyLabelView;
  1. 关于空行
    • .h中的空行 --文件说明与头文件包含(#import)之间空1行
      • 头文件包含(#import)之间,如果需要分类区别,各类别之间空1行。
      • 头文件包含(#import)与@class之间空2行。
      • @interface与@class之间空1行。
      • 头文件{}里面,空1行开始声明对象成员,如果需要分类区别,各类别之间空1行。
      • 头文件{}外,空1行书写属性,如果需要分类区别,各类别之间空1行。
      • 属性下面空1行开始写方法,如果需要分类区别,各类别之间空1行。
      • 方法完成后,空1行@end。
      • 如果需要声明protocol,空2行接着写。通常protocol写在@end后面,但是声明在@interface之前。 -.m中的空行
      • 文件说明与头文件包含(#import)之间空1行
      • 头文件包含(#import)之间,如果需要分类区别,各类别之间空1行。
      • @implementation和@synthesize之间空1行, 如果需要分类区别,各类别之间空1行。
      • @synthesize与方法之间空1行。
      • 方法与方法之间空1行。
    • 方法里面的空行
      • 变量声明后需要空1行,如果需要分类区别,各类别之间空1行。
      • 条件、循环,选择语句,整个语句结束,需要空1行。
      • 各功能快之间空1行。
      • 最后一个括弧之前不空行。
      • 注释与代码之间不空行。
      • 类中第个功能模块以 #pragma mark - 分隔,上空两行,下空一行。
      • 每行代码最多不得操作80个字。设置如下:Xcode => Preferences =>TextEditing => Page Guide at column /输入 80即可。

3.4 命名规范

  1. 保留字 Objective-c语言的保留字或关键词应全部使用小写字母,除下表中保留字外,private、protected、public、在类型说明中也作为保留字使用。还有nonatomanic,retain,readwrite,readonly等也有特殊的使用场合。
  1. 方法
    • 方法的名称应全部使用有意义的单词组成,且以小写字母开头,多单词组合时,后面的单词首字母大写。例如:
- (void)getUserInformation……
  • 设置类变量的内容的方法应使用set作为前缀,读取变量的内容的方法应使用get作为前缀。例如:
- (void)getUserName;
- (void)setUserName: (NSString *)userName;
  • 方法中的参数:第一个参数名称要从函数名称上携带出来,第二个参数的首字母小写,多个单词组合时,后面单词首字母大写。参数有别名时,参数别名与参数名一致,但参数名前缀以_。参数别名与前一参数保留1个空格。参数无别名时,以有意义的字母命名。例如:
- (void)myFunctionWithSizeA:(CGSize)sizeA
sizeB:(CGSize)_sizeB;
  • 当参数过长时,每个参数占用一行,以冒号对齐
- (void)writeFisrtNumber:(NSString *)firstStr
withNextNumber:(NSString *)nextStr
withLastNumber:(NSString *)lastStr {
}
  • 如果方法名比参数名短,每个参数占用一行,至少缩进4个字符,且为垂直对齐(而非使用冒号对齐)
- (void)writeA:(NSString *)firstStr
withBBBBBBBBBBB:(NSString *)nextStr
withCCCCCC:(NSString *)lastStr { }
  1. 变量
    • 变量必须起有意义的名字,使其他组员可以很容易读懂变量所代表的意义,变量命名可以采用同义的英文命名,可使用几个英文单词,第一个单词首字母小写,其他单词首字母大写。例如:
NSString *username;
  • 对于一些特殊类型的变量,命名时要带上类型,如NSArray的变量命名为xxxArray,其他的如xxxDictionary,xxxSize等。这样就可以从名称上知道是什么类型的变量。千万不能将NSArray的变量命名为xxxDictionary. 如若是可变的变量加M, eg: xxxMArray。
  • 对于要和interface builder关联的的输出口变量,命名时要后缀以特定的控件名.常见的:
UIViewController:VC          UIImage:Img                UIImageView:ImgView  UIView:View  
UILabel:Label UIButton:Btn  UINavigationBar:NBar  UIToolBar:TBar  
UISearchBar:SBar UITextField:textField  UITextView:TextView
NSArray:Array   NSMutableArray:MArray NSDictionary:Dict   NSMutableDictionary:Dict
NSString:Str   NSMutableString:MStr NSSet:Set      NSMutableSet:MSet
  • 对于使用c语言形式声明的变量,一些特定类型可采用一定的简写:例如:
指针类型:P
结构体类型:Rec
数组类型:Arr
Core Graphic:CG 等。
  • 循环控制变量通常使用单一的字符如:i、j、k等。使用有意义的名字,如objectIndex也是可以的。
  • 尽量避免使用全局变量,如果必须使用全局变量则必须加前缀‘ Pub_’,同时应在变量名称中体现变量的类型。
  • 私有实例变量前加一个下划线,如_myPrivateVarible。
  • 枚举变量也要有相应的前缀来区分不同的enum变量。比如苹果公司的一个enum。例如:
/* Drawing modes for text. */

enumCGTextDrawingMode {
kCGTextFill,
kCGTextStroke,
kCGTextFillStroke,
kCGTextInvisible,
kCGTextFillClip,
kCGTextStrokeClip,
kCGTextFillStrokeClip,
kCGTextClip
};
  1. 常量
    • 避免在程序中直接出现常数,使用超过一次的应以宏定义的形式来替代。
    • 常数的宏定义应与它实际使用时的类型相一致。如以3.0来定义浮点类型,用3表示整型。
    • 常量的命名应当能够表达出它的用途,并且用大写字母表示。例如:
#define PI 3.1415926
  • 宏变量以k开头.eg:
#define kLogin “login”
    • 所有的类名,接口名(Protocol)均以大写字母开头,多单词组合时,后面的单词首字母大写。类,接口名必须是有意义的。
    • 继承自UIView的类以View结尾。例如:
OperatorUsersInfomationView,LabelView等。
  • 继承自ViewController的类以viewController结尾。例如:
HomePageViewController,LoginViewController等。其他类推。
  • 所有保存数据的实体以Model结尾。例如:
UserModel,FriendModel
  • 如果类声明中包含多个protocal,每个protocal占用一行,缩进2个字符
@interfaceRootViewController : UITableViewController <
UITableViewDelegate,
UITableViewDataSource,
UITextFieldDelegate,
UITextViewDelegate > {
……
}

4 修改规范

4.1 新增代码行

新增代码行的前后应有注释行说明。

//修改人,修改时间,修改说明
新增代码行
//修改结束

4.2 删除代码行

删除代码向的前后用注释行说明

//修改人,修改时间,修改说明
要删除的代码行(将要删除的语句进行注释)
//修改结束

4.3 修改代码行

修改代码行以注释旧代码行后再新增代码行的方式进行。

//修改人,修改时间,修改说明
//修改前代码行开始
//修改前代码行
//修改前代码行结束
//修改后代码行开始
修改后代码行
//修改结束