iOS 代码规范

摘要:
1目的在XCode编辑环境中统一和标准化Objective-C和swift的编码风格和标准。2适用范围适用于使用Objective-C和swift语言开发的所有项目。3编码规范3.1文件项目文件必须使用前缀为PRJ_的有意义的名称。ReturnValue){//用于调用登录进程的无用注释NSLog失败;}方法注释建议使用Xcode插件VVDocument,变量注释为/**/,例如:/*****@paramapplication*@paramlaunchOptions**@return*/-application:applicationdidFinishLaunchingWithOptions:launchOptions{//Overridepointforcustomationafterapapplicationlaunch.returnYES;}3.3编码格式代码的缩进应使用空格而不是制表符,缩进为2个字符。每行代码最多不能操作80个单词。

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 修改代码行

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

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

免责声明:文章转载自《iOS 代码规范》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Portal.MVC —— nopcommerce的简化版微信小程序中的图形验证码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

CMake高级用法

0. 写在最前面本文将总结自己日常用到的CMake命令以及功能。如有错误,欢迎在评论中指正。 如果觉得写得还不错,就请收藏一下啦~~~也可以找一下我写的其他文章来看一下。关注一下我的专栏什么的。 你的Star是作者坚持下去的最大动力哦~~~ 在这里可以查到关于命令的官方文档 使用宏定义:macro macro(add_example name) a...

Jmeter之 forEach 遍历所有值

今天遇到一个场景,通过正则表达式提取多个值,然后保存到文件中去 正则表达式 1、一开始的思路是通过后置 Beanshell断言进行,得到文件数据为 null FileWriter fstream=new FileWriter ("D://test.csv",true); BufferedWriter out=new BufferedWriter(fstre...

浅谈volatile与automicInteger

在并发环境中有三个因素需要慎重考量,原子性、可见性、有序性。   voatile 保证了有序性(防止指令冲排序)和变量的内存可见性(每次都强制取主存数据),每次取到volatile变量一定是最新的   volatile主要用于解决可见性,它修饰变量,相当于对当前语句前后加上了“内存栅栏”。使当前代码之前的代码不会被重排到当前代码之后,当 前代码之后的指令不...

由SpringMVC中RequetContextListener说起

零、引言 RequetContextListener从名字结尾Listener来看就知道属于监听器。 所谓监听器就是监听某种动作,在其开始(初始化)和结束(销毁)的时候进行某些操作。 由此可以猜测:该类用于在RequetContext(请求上下文对象)创建和销毁的时候进行某些操作(哪些操作?结尾总结!) 一、web.xml配置要使用该listener对象...

PL/SQL developer(绿色版)安装及配置

转自:https://blog.csdn.net/qq_35525955/article/details/81067362PL/SQL developer(绿色版)安装及配置  1.PL/SQL Developer下载地址:百度网盘; 2.tsname.ora配置(在解压路径下instantclient_11_2 nsnames.ora): orcl =...

豆瓣客户端(二)获取用户信息和搜索用户

之前写了豆瓣客户端(一)获取授权码和访问令牌后,就开始学习iOS7 TextKit方面的内容了,在前两天看Text Kit 看得无聊以后,又再回来写自己一直都很感兴趣的豆瓣客户端。途中遇到了各种各样的问题,先来小小吐槽一下:豆瓣的开发文档真是坑爹极了,基本上没有步骤可言,有时候就是一句带过,来个只能意会不能言传,难怪那么少人做豆瓣客户端,可能这个客户端赚不...