美文网首页
iOS开发代码规范

iOS开发代码规范

作者: Ampaw | 来源:发表于2018-11-16 14:56 被阅读3次

摘要

在编写代码中,我们要有意识的注意代码规范对团队协作的重要性!

1.关于命名

1.1 统一要求

   含义清楚,尽量做到不需要注释也能了解其作用,若做不到就要添加注释说明。

1.2 类的命名

大驼峰式命名:
   每个单词的首字母都采用大写字母(如:BYLoginView)
后缀要求:
   模型类:使用Model做后缀(如:BYUserModel)
   工具类:使用Utils或者Tools或者Helper(如:BYBundleHelper)
   协议:使用Protocol做后缀(如:BYLoginViewProtocol)
   ViewController:使用ViewController做后缀(如:BYLoginViewController)
   View:使用View做后缀(如:BYLoginView)
   TableViewCell:使用Cell做后缀(如:BYUserListCell)
   其他UI控件以此类推 ……

1.3 分类(类别)命名

   与类名相同,此外需添加要扩展的类名 "+"(如:NSString+Login)

1.4 私有变量

小驼峰式命名:
   第一个单词以小写字母开始,后面单词的首字母全部大写(如:userName)
以_开头:
   第一个单词首字母小写(如:NSString * _userName;)
注意:
  私有变量放在 .m 文件中声明

1.5 property 变量

小驼峰式命名:

@property (nonatomic, copy) NSString *userName;  // 用户名
1.6 宏定义命名

全部大写:
   单词之间用 _ 分隔【不带参数】

#define THIS_IS_AN_MACRO @"THIS_IS_AN_MACRO"

以字母 k 开头:
   后面遵循大驼峰命名【不带参数】

#define kWidth self.frame.size.width

小驼峰式命名:【带参数】

#define getImageUrl(url) [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",kBaseUrl,url]]
1.7 枚举

   Enum 类型的命名与类的命名规则一致,Enum 中枚举内容的命名需以 Enum 类型名称开头。

typedef NS_ENUM(NSInteger,LoginMainViewActionTag) {
    LoginMainViewActionTagTourist  = 1001, // 游客登录
    LoginMainViewActionTagRegister = 1002, // 注册账号
    LoginMainViewActionTagSignIn   = 1003, // 账号登录
    LoginMainViewActionTagForgot   = 1004, // 忘记密码
};
1.8 Delegate 命名

   类的实例必须为回调方法的参数之一,如:

-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section ;

   回调方法的参数只有类自己的情况,方法名要符合实际含义,如:

-(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView ;

   以类的名字开头(回调方法存在两个以上参数的情况)以表明此方法是属于哪个类,如:

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath ;

   使用 did 或 will 通知 Delegate 已经发生的变化或将要发生的变化,如:

-(NSIndexPath*)tableView:(UITableView*)tableView willSelectRowAtIndexPath:(NSIndexPath*)indexPath;
-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath;
1.9 方法命名

   首字母小写,之后每个单词首字母大写,方法名尽量使用动词短语。如:

  •   如果该方法对内部使用的在前面加“_”
  •   如果该方法对外部使用的在前面不加“_” 。
- (void) loadData:(NSData *)data
{...}

- (void) _loadData:(NSData *)data
{...}

注意:
   (1)“-”号后面,有空格;
   (2)“(void)” 后面,有空格;
   (3)传递参数的类型,如果是指针,类与*号之间有空格。

1.10 方法参数命名

   首字母小写,之后每个单词首字母大写,具有足够的说明性,如:

- (void) setUserData:(NSDictionary *)userInfo;
1.11 图片命名

   使用英文,全部小写,单词中间以“_”隔开。不同模块,可添加UI模块作为前缀,避免冲突,(如:bar_icon_title)

2.私有方法及变量声明

   在 .m 文件中最上方,定义空的 category 进行声明,如:

#import "BYLoginView.h"

// 在这个category(类目)中定义变量和方法
@interface BYLoginView ()
{
     // 声明私有变量
}
// 私有方法
- (void)samplePrivateMethod;
@end

@implementation BYLoginView
// 私有方法的实现
- (void)samplePrivateMethod
{...}
@end

3.关于注释

   若命名规范,代码又能做到见名知意,则可以不用添加注释;否则需适当的添加一些注释或Mark说明。

3.1 属性声明注释
/// 用户名
@property (nonatomic, copy) NSString *userName;
3.2 方法声明注释
/** 
*  登录
*
* @param username 用户名
* @param password 密码
* @param complete 执行完毕的block
*/
+ (void)loginWithUserName:(NSString *)username password:(NSString *)password complete:(void (^)(NSDictionary *dict))complete;

4.关于UI布局

   如果使用 Interface Builder 进行界面布局,需xib文件的命名与其对应的 .h 文件保持相同,xib文件中控制的组织结构要合理,且xib文件中控件需要有合理的可读性强的命名,方便阅读代码的人理解。
   如果使用 Auto Layout 进行界面布局,UI控件的命名也要注意规范,及需在 .m 文件中最上方,定义空的 category 进行声明。

5.格式化代码

5.1 指针 * 的位置

   定义一个对象时,指针 * 靠近变量(如:NSString *userName;)

5.2 方法的声明和定义

   在 - 、+ 和返回值之间留一个空格,方法名和第一个参数之间不留空格。如:

+ (void)loginWithUserName:(NSString *)username password:(NSString *)password complete:(void (^)(NSDictionary *dict))complete;

- (void)loginWithUserName:(NSString *)username password:(NSString *)password complete:(void (^)(NSDictionary *dict))complete;
5.3 代码缩进

   在 Method 与 Method 之间,空一行。如:

+ (void)loginWithUserName:(NSString *)username password:(NSString *)password complete:(void (^)(NSDictionary *dict))complete
{...}

- (void)loginWithUserName:(NSString *)username password:(NSString *)password complete:(void (^)(NSDictionary *dict))complete
{...}
5.4 对 Method 进行分组
#pragma mark - life cycle methods
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{...}

- (void)viewDidLoad
{...}

#pragma mark - public methods
- (void)samplePublicMethod
{...}

- (void)sample
{...}

#pragma mark - private methods
- (void)samplePrivateMethod
{...}

- (void)sampleForIf
{...}
5.5 大括号写法

   对于类的 Method:左括号,另起一行写(遵循苹果官方开发者文档),如:

- (id)initWithNibName:(NSString *)nibNameOrNilbundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

   对于其他使用场景:左括号,可以跟在第一行后边,如:

- (void)sampleForSwitch
{
    SampleEnum testEnum = SampleEnumTwo;
    switch(testEnum) {
        case SampleEnumUndefined:{
            // do something
            break;
        }
        case SampleEnumOne:{
            // do something
            break;
        }
        case SampleEnumTwo:{
            // do something
            break;
        }
        default:{
            NSLog(@"WARNING: there is an enum type not handled properly!");
            break;
        }
    }
}

6.头文件.h执行文件.m

6.1 .h 文件

   #import "xxxx.h" 部分头文件时,如果只是内部使用,请放在.m文件下;.h 使用 @class xxxx 声明该类即可。文件下有声明代理,把@protocol 代理放在 @interface 上面。代理方法必须包含该类名。如:

@class BYLoginMainView;
@protocol BYLoginMainViewDelegate <NSObject>
/**
 * 触发控件
 *
 * @param loginMainView 主登录View
 * @param index 标识
 * @param accountInfo 点击“登录”时,传出数据【 如:@{@"username":@"username",@"password":@"password"}】
 */
- (void)loginMainView:(BYLoginMainView *)loginMainView didSelectControlAtIndex:(NSInteger)index accountInfo:(NSDictionary *)accountInfo;
@end
@interface BYLoginMainView : UIView
@property (nonatomic,assign) id<BYLoginMainViewDelegate> delegate;
@end
6.2 .m 文件

   在 @implementation BYLoginMainView 上方使用 @interface RFLoginMainView ( ) @end ;将不被外部使用的代理,添加在.m@interface ( )下。如:

@interface BYLoginMainView ()<UITableViewDelegate,UITableViewDataSource>

@end

7.代码整体规范

   系统函数放在上面,自定义函数放在中间,Setter 与 Getter 方法放在下面。如:

#import "BYLoginView.h"

@implementation BYLoginView

- (instancetype)init {
    self = [super init];
    if (self) {
        self.backgroundColor = [UIColor colorWithWhite:0. alpha:[BYCustomColors sharedCustomColors].bg_alpha];
        [self loginMainViewToScreen];
    }
    return self;
}

#pragma mark - Actions
- (void)loginMainViewToScreen
{
    [self.loginMainView addToSuperView:self];

    if (![self.currentView isKindOfClass:[self.loginMainView class]]) {
        [self show:self.loginMainView stopAnimation:NULL];
    }
}

#pragma mark - Getter Method
- (BYLoginMainView *)loginMainView {
    if (!_loginMainView) {
        _loginMainView = [[BYLoginMainView alloc] initWithDeleggate:self];
    }
    return _loginMainView;
}
@end

相关文章

  • 乐乎-代码规范概述

    参考: 1、iOS中书写代码规范35条小建议 2、iOS开发总结之代码规范 3、iOS代码编程规范-根据项目经验汇...

  • iOS开发总结之代码规范

    iOS开发总结之代码规范

  • iOS开发规范

    iOS代码编写规范Git的使用iOS进阶开发 目的 了利于项目维护以及规范开发,促进成员之间Code Review...

  • iOS 代码规范篇

    iOS 代码规范篇 iOS 代码规范篇

  • iOS 开发代码规范

    1. 关于命名 1.1 统一要求 含义清楚,尽量做到不需要注释也能了解其作用,若做不到,就加注释 使用全称,不适用...

  • iOS开发:代码规范

    一、注释规范 iOS注释主要分为以下几种:属性注释、方法集注释、方法注释、普通注释(单行注释)、类注释。 1、属性...

  • iOS开发代码规范

    摘要 在编写代码中,我们要有意识的注意代码规范对团队协作的重要性! 1.关于命名 1.1 统一要求    含义清楚...

  • iOS开发代码规范

    版本:1.0时间:2018年9月20日 1.命名规范 1.1. 属性、数据类型命名规范 1.1.1. 声明的属性和...

  • iOS开发代码规范

    1.关于命名 1.统一要求 含义清楚,尽量做到不需要注释也能了解其作用,若做不到,就加注释 使用全称,不适用缩写 ...

  • iOS开发代码规范

    一. 关于命名 统一要求 含义清楚,尽量做到不需要注释也能了解其作用,若做不到,就加注释 使用全称,不适用缩写 类...

网友评论

      本文标题:iOS开发代码规范

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