iOS 代码规范(自个公司)

iOS Objective-C Code Style

前言 : 为了使代码清晰简洁,方便阅读理解,都会统一遵从一定的代码规范 .
本期使用MVC框架 , 保持公共API 的简洁性 .

一、命名

1.每行的长度

每行的长度不得超过 120 个字符
设置: “Xcode => Preferences => TextEditing => 勾选 Show Page Guide / 输入100 => OK”


2.关于命名

统一要求 : 含义清楚,尽量做到不需要注释也能了解其作用,若做不到,就加注释 .
          按照驼峰式命名法则:(大驼峰:每个单词首字母都大写--小驼峰:第一个单子首字母小写,其余都大写)
         类名首字母大写,方法首字母小写,方法中的参数首字母小写,长度无限制.
         尽量方法名读起来一句话
         变量名的大小在2-20个字母之间,避免单字母变量.


1>property变量


@property (nonatomic, strong) NSMutableArray *驼峰命名规则:
                                                指针*要靠近变量名
                                                前部分参数用途: path 
                                                后部分参数类型: muArr
                                                最后: 注释(若后期维护新添加或删除的变量-加自个名字)
@property (nonatomic, strong) NSMutableArray *pathMuArr;//可变数组用来储存路径- LYG 

缩写规则:
        (如:表)

字符串
NSString
str
可变字符串
NSMutableString
muStr
字典
NSDictionary
dic
可变字典
NSMutableDictionary
muDic
数组
NSArray
arr
可变数组
NSMutableArray
muArr
数据
NSData
data
可变数组
NSMutableData
muData
标签
UILabel
label
按钮
UIButton
btn
图片
UIImage
img
图片视图
UIImageView
imgV
bool 值
BOOL
is…

UINavigationController
nav

backgroundColor
bg

UITableViewCell
cell

UIViewController
viewController

UIView
view

2>宏 Define

⁃   全部大写,单词用_进行分割(不带参数)
    #define THIS_IS_AN_MACRO @"THIS_IS_AN_MACRO"

⁃   以字母 k 开头,后面要遵循大驼峰命名规则(不带参数)
    #define kDefaultLineWidth 8
   #define kWidth self.frame.size.width

⁃   小驼峰命名(带参数)
 #define getImageUrl(url) [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",kBaseUrl,url]]


3>枚举 Eeum

⁃   枚举命名和类的命名一样
⁃   枚举中的内容命名需要以改枚举类型名称开头

    typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
     AFNetworkReachabilityStatusUnknown = -1,
     AFNetworkReachabilityStatusNotReachable = 0,
     AFNetworkReachabilityStatusReachableViaWWAN = 1,
     AFNetworkReachabilityStatusReachableViaWiFi = 2
    };

    typedef NS_ENUM(NSInteger ,DrawStyle){
        DrawStyleFreedomLine = 100,
        DrawStyleLine = 1,
        DrawStyleCircle = 2,
        DrawStyleRectangle = 3,
        DrawStyleOval = 4,
        DrawStyleTriangle = 5,
        DrawStyleCurve = 6,
        DrawStyleRubber = 7
    };      


4>代理 Delegate

    Protocol : 使用 delegate 作为后缀

⁃   类的实例必须为回调方法的参数之一(numberOfRowsInSection中的section)
    -(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section


⁃   回调方法的参数只有类自己的情况,方法名要符合实际含义(numberOfSectionsInTableView)
      -(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView


⁃   以类的名字开头(回调方法存在两个以上参数的情况)以表明此方法是属于哪个类的(tableView)
    -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


类型标示符、代理名称、尖括号间不留空格
该规则同样适用于:类声明、实例变量和方法声明 
 每一个delegate都把对应的protocol名字带上,delegate方法不要乱写,写到一块区域里面去

@interface MyProtocoledClass : NSObject {
@private
id _delegate;
}

  • (void)setDelegate:(id)aDelegate;@end
    如果类声明中包含多个protocal,每个protocal占用一行,缩进4个字符。
    如:
    @interface CustomViewController : ViewController<
    AbcDelegate,
    DefDelegate

{
... }

5>block

使用Block时,内容四个空格缩进,“^”后带有参数时,参数与“{”之间有一个空格缩进
@property (nonatomic ,copy) void (^colorBlock)(UIColor *);




6>方法的声明和定义

⁃   在 - OR + 和返回值之间留 1 个空格,方法名和第一个参数间不留空格 
- (void)doSomethingWithString:(NSString *)theString 
    {
      ...
      }
  ⁃ 当参数过长时,每个参数占用一行,以冒号对齐
     - (void)doSomethingWith:(GTMFoo *)theFoo
                        rect:(NSRect)theRect
                    interval:(float)theInterval
        {
        ...
        }

  ⁃ 如果方法名比参数名短,每个参数占用一行,至少缩进4个字符,且为垂直对齐
    - (void)writeA:(NSString *)firstStr
            withBBBBBBBBBBB:(NSString *)nextStr
            withCCCCCC:(NSString *)lastStr
    {
      ...  
    }


  ⁃ Method与Method之间空一行(官方规定左括号应另起一行)
    - (void)samplePrivateMethod
    {
        ...
    }

    - (void)sampleForIf
    {
        ...
    }




7>使用#pragma Mark - 标注一类函数,便于查找

iOS Objective-C Code Style

前言 : 为了使代码清晰简洁,方便阅读理解,都会统一遵从一定的代码规范 .
本期使用MVC框架 , 保持公共API 的简洁性 .

一、命名

1.每行的长度

每行的长度不得超过 120 个字符
设置: “Xcode => Preferences => TextEditing => 勾选 Show Page Guide / 输入100 => OK”


2.关于命名

统一要求 : 含义清楚,尽量做到不需要注释也能了解其作用,若做不到,就加注释 .
          按照驼峰式命名法则:(大驼峰:每个单词首字母都大写--小驼峰:第一个单子首字母小写,其余都大写)
         类名首字母大写,方法首字母小写,方法中的参数首字母小写,长度无限制.
         尽量方法名读起来一句话
         变量名的大小在2-20个字母之间,避免单字母变量.


1>property变量


@property (nonatomic, strong) NSMutableArray *驼峰命名规则:
                                                指针*要靠近变量名
                                                前部分参数用途: path 
                                                后部分参数类型: muArr
                                                最后: 注释(若后期维护新添加或删除的变量-加自个名字)
@property (nonatomic, strong) NSMutableArray *pathMuArr;//可变数组用来储存路径- LYG 

缩写规则:
        (如:表)

字符串
NSString
str
可变字符串
NSMutableString
muStr
字典
NSDictionary
dic
可变字典
NSMutableDictionary
muDic
数组
NSArray
arr
可变数组
NSMutableArray
muArr
数据
NSData
data
可变数组
NSMutableData
muData
标签
UILabel
label
按钮
UIButton
btn
图片
UIImage
img
图片视图
UIImageView
imgV
bool 值
BOOL
is…

UINavigationController
nav

backgroundColor
bg

UITableViewCell
cell

UIViewController
viewController

UIView
view

2>宏 Define

⁃   全部大写,单词用_进行分割(不带参数)
    #define THIS_IS_AN_MACRO @"THIS_IS_AN_MACRO"

⁃   以字母 k 开头,后面要遵循大驼峰命名规则(不带参数)
    #define kDefaultLineWidth 8
   #define kWidth self.frame.size.width

⁃   小驼峰命名(带参数)
 #define getImageUrl(url) [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",kBaseUrl,url]]


3>枚举 Eeum

⁃   枚举命名和类的命名一样
⁃   枚举中的内容命名需要以改枚举类型名称开头

    typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
     AFNetworkReachabilityStatusUnknown = -1,
     AFNetworkReachabilityStatusNotReachable = 0,
     AFNetworkReachabilityStatusReachableViaWWAN = 1,
     AFNetworkReachabilityStatusReachableViaWiFi = 2
    };

    typedef NS_ENUM(NSInteger ,DrawStyle){
        DrawStyleFreedomLine = 100,
        DrawStyleLine = 1,
        DrawStyleCircle = 2,
        DrawStyleRectangle = 3,
        DrawStyleOval = 4,
        DrawStyleTriangle = 5,
        DrawStyleCurve = 6,
        DrawStyleRubber = 7
    };      


4>代理 Delegate

    Protocol : 使用 delegate 作为后缀

⁃   类的实例必须为回调方法的参数之一(numberOfRowsInSection中的section)
    -(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section


⁃   回调方法的参数只有类自己的情况,方法名要符合实际含义(numberOfSectionsInTableView)
      -(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView


⁃   以类的名字开头(回调方法存在两个以上参数的情况)以表明此方法是属于哪个类的(tableView)
    -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


类型标示符、代理名称、尖括号间不留空格
该规则同样适用于:类声明、实例变量和方法声明每一个delegate都把对应的protocol名字带上,delegate方法不要乱写,写到一块区域里面去
@interface MyProtocoledClass : NSObject {
@private
 id _delegate;
 }
- (void)setDelegate:(id)aDelegate;@end
如果类声明中包含多个protocal,每个protocal占用一行,缩进4个字符。 
如: 
 @interface CustomViewController : ViewController<
   AbcDelegate,
   DefDelegate
{ 
... } 

5>block

使用Block时,内容四个空格缩进,“^”后带有参数时,参数与“{”之间有一个空格缩进
@property (nonatomic ,copy) void (^colorBlock)(UIColor *);




6>方法的声明和定义

⁃   在 - OR + 和返回值之间留 1 个空格,方法名和第一个参数间不留空格 
- (void)doSomethingWithString:(NSString *)theString 
    {
      ...
      }
  ⁃ 当参数过长时,每个参数占用一行,以冒号对齐
     - (void)doSomethingWith:(GTMFoo *)theFoo
                        rect:(NSRect)theRect
                    interval:(float)theInterval
        {
        ...
        }

  ⁃ 如果方法名比参数名短,每个参数占用一行,至少缩进4个字符,且为垂直对齐
    - (void)writeA:(NSString *)firstStr
            withBBBBBBBBBBB:(NSString *)nextStr
            withCCCCCC:(NSString *)lastStr
    {
      ...  
    }


  ⁃ Method与Method之间空一行(官方规定左括号应另起一行)
    - (void)samplePrivateMethod
    {
        ...
    }

    - (void)sampleForIf
    {
        ...
    }




7>使用#pragma Mark - 标注一类函数,便于查找


    8>注释问题

▪   .h和.m 文件注释:

/* 登陆页面主页 ***********************************************************************************************************

  • 类名* 建立日期* 版权声明作者模块描述----------------------------------------------------------------* 修改历史* 序号 日期 修改人 修改原因12 **********************************************************************************************************
    */
▪   类和对象方法注释:

1 /**
2   * @brief 登录验证
3   *
4   * @param personId 用户名
5   * @param password 密码
6   * @param complete 执行完毕的block
7   *
8   * @return
9   */
10   + (void)loginWithPersonId:(NSString *)personId password:(NSString *)password complete:(void (^)(CheckLogon *result))complete;

▪   声明注释

@property (nonatomic, strong) Student *student; //进行单行注释
采用//进行单行注释。所有逻辑判断需要添加注释说明。所有变量、常量需要添加注释说明

对 nil 的检查
▪ 仅在有业务逻辑需求时检查 nil,而非为了防止崩溃▪ 向 nil 发送消息不会导致系统崩溃,Objective-C 运行时负责处理

对 BOOL 陷阱
▪ 禁止将int直接转换(cast or convert)为BOOL 。Objective-C中,BOOL 被定义为 unsigned char,这意味着除了 YES (1) 和 NO (0)外它还可以是其他 值。▪ 将整型值转换为 BOOL 的方法:使用三元运算符返回 YES / NO,或使用位运算符 (&&, ||, !)。
▪ 禁止将数组的大小、指针值或位运算符的结果转换(cast or convert)为 BOOL,因为该 BOOL 值的结果取决于整型值的最后一位。▪ 在Objective-C中,只允许使用BOOL▪ 如:
// 禁止- (BOOL)isBold {
return [self fontTraits] & NSFontBoldTrait;
}
- (BOOL)isValid {
return [self stringValue];
}
// 推荐- (BOOL)isBold {
return ([self fontTraits] & NSFontBoldTrait) ? YES : NO;
}
- (BOOL)isValid {
return [self stringValue] != nil;
}
- (BOOL)isEnabled {
return [self isValid] && [self isBold];
}
▪ 禁止直接将 BOOL 和 YES/NO 比较,如:
// 禁止
BOOL great = [foo isGreat]; if (great == YES)...// 推荐
BOOL great = [foo isGreat];
if (great)
...

 常用的快捷方式
    command+r 运行
    command+. 停止 死循环中用到
    command+b 编译 编译程序不运行
    command+z 回退
    command+shift+z 前进
    command+a 全选
    command+c v x  复制 粘贴 剪贴
    command+tab 不同程序之间的切换
    command+ ~ 相同程序之间切换
    command+q 退出
    command + shift + J 快速定位当前所在文件位置

更多快捷键: http://www.cocoachina.com/ios/20160822/17393.html

iOS团队要求

1 删除多余的空行 * 所有方法与方法之间空1行 * 所有代码块之间空1行
2 删除多余的注释 * 删除注释掉的代码 * 删除没有意义的注释
3 删除多余的方法 * 如果方法没有使用到,请删除它 * 如果方法没有执行任何业务逻辑,请删除它或者给出一定注释
4 删除未被使用的资源文件
5 添加必要的注释 * 所有 .h 文件中的property 需要给出注释 * 所有自定义的方法需要给出注释 * 比较大的代码块需要给出注释 * 所有代码中出现的阿拉伯数字需要给出注释 * 程序中出现加密/解密 逻辑的操作地方,需要给出注释说明过程(无论是系统还是自定义)
6 整体代码风格需要统一 * 代码后面的”{“ 不需要单独占用一行 * 逻辑运算符 与 代码之间空一格 * “#pragma mark -” 与下面的代码之前不要空行 * 遵循一般性的代码规范

写代码规范35条小建议: http://www.jianshu.com/p/71fdd1ae714c

    8>注释问题

▪   .h和.m 文件注释:

/* 登陆页面主页 ***********************************************************************************************************

  • 类名* 建立日期* 版权声明作者模块描述----------------------------------------------------------------* 修改历史* 序号 日期 修改人 修改原因12 **********************************************************************************************************
    */
▪   类和对象方法注释:

1 /**
2   * @brief 登录验证
3   *
4   * @param personId 用户名
5   * @param password 密码
6   * @param complete 执行完毕的block
7   *
8   * @return
9   */
10   + (void)loginWithPersonId:(NSString *)personId password:(NSString *)password complete:(void (^)(CheckLogon *result))complete;

    ▪   声明注释
`
@property (nonatomic, strong) Student *student; //进行单行注释`
采用//进行单行注释。所有逻辑判断需要添加注释说明。所有变量、常量需要添加注释说明


对 nil 的检查 
▪ 仅在有业务逻辑需求时检查 nil,而非为了防止崩溃▪ 向 nil 发送消息不会导致系统崩溃,Objective-C 运行时负责处理 


对 BOOL 陷阱 
▪ 禁止将int直接转换(cast or convert)为BOOL 。Objective-C中,BOOL 被定义为 unsigned char,这意味着除了 YES (1) 和 NO (0)外它还可以是其他 值。▪ 将整型值转换为 BOOL 的方法:使用三元运算符返回 YES / NO,或使用位运算符 (&&, ||, !)。 
▪ 禁止将数组的大小、指针值或位运算符的结果转换(cast or convert)为 BOOL,因为该 BOOL 值的结果取决于整型值的最后一位。▪ 在Objective-C中,只允许使用BOOL▪ 如: 

// 禁止- (BOOL)isBold {
return [self fontTraits] & NSFontBoldTrait;
}
- (BOOL)isValid {
return [self stringValue];
}
// 推荐- (BOOL)isBold {
return ([self fontTraits] & NSFontBoldTrait) ? YES : NO;
}
- (BOOL)isValid {
return [self stringValue] != nil;
}
- (BOOL)isEnabled {
return [self isValid] && [self isBold];
}
▪ 禁止直接将 BOOL 和 YES/NO 比较,如:
// 禁止
BOOL great = [foo isGreat]; if (great == YES)...// 推荐
BOOL great = [foo isGreat];
if (great)
...




     常用的快捷方式
        command+r 运行
        command+. 停止 死循环中用到
        command+b 编译 编译程序不运行
        command+z 回退
        command+shift+z 前进
        command+a 全选
        command+c v x  复制 粘贴 剪贴
        command+tab 不同程序之间的切换
        command+ ~ 相同程序之间切换
        command+q 退出
        command + shift + J 快速定位当前所在文件位置

[更多快捷键](http://www.cocoachina.com/ios/20160822/17393.htm)



----


iOS团队要求

1 删除多余的空行     * 所有方法与方法之间空1行     * 所有代码块之间空1行
2 删除多余的注释    * 删除注释掉的代码     * 删除没有意义的注释
3 删除多余的方法     * 如果方法没有使用到,请删除它     * 如果方法没有执行任何业务逻辑,请删除它或者给出一定注释
4 删除未被使用的资源文件
5 添加必要的注释     * 所有 .h 文件中的property 需要给出注释     * 所有自定义的方法需要给出注释     * 比较大的代码块需要给出注释     * 所有代码中出现的阿拉伯数字需要给出注释     * 程序中出现加密/解密 逻辑的操作地方,需要给出注释说明过程(无论是系统还是自定义)
6 整体代码风格需要统一     * 代码后面的”{“ 不需要单独占用一行     * 逻辑运算符 与 代码之间空一格     * “#pragma mark -” 与下面的代码之前不要空行     * 遵循一般性的代码规范


[写代码规范35条小建议](http://www.jianshu.com/p/71fdd1ae714c)

你可能感兴趣的:(iOS 代码规范(自个公司))