美文网首页
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
    

    相关文章

      网友评论

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

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