iOS 编码规范

芦苇科技 【 iOS 编码规范 】

概要

Objective-C 是一门面向对象的动态编程语言,主要用于编写 iOS 和 Mac 应用程序。关于 Objective-C 的编码规范,苹果和谷歌都已经有很好的总结:

Apple Coding Guidelines for Cocoa Google Objective-C Style Guide

本文主要参考了对上述文档的翻译、查阅其他的相关资料和经过公司 iOS 小组的深刻讨论,为公司 iOS 小组总结出一份通用的编码规范

命名规范

  • 基本原则

驼峰命名(特殊除外)

followAnchorButton
复制代码

尽可能清晰,尽量不使用缩写,建议使用完整单词

// 建议
setBackgroundColor
headImageView
settingButton

// 不建议
setBkgColor
headImg
setBtn
复制代码
  • 命名类

使用前缀:类前缀一般为项目名称缩写开头大写字母

前缀 + 描述 + 类型

//SuperTA 
|- STLoginViewController
|- STUserInfoModel
|- STHomeTableCell
|- STCenterTableHeaderView
复制代码
  • 命名方法

按照苹果的说法“好的方法名应当可以以一个句子的形式朗读出来”

一般以小写字母开头,每一个后续的单词首字母大写

// 动词开头的方法表示让对象执行一个动作
- (void)invokeWithTarget:(id)target;
复制代码
  • 命名属性

属性同样遵循第一个字母小写,后续单词首字母大写,同时不必添加前缀,采用非原子性 nonatomic + 对应内存管理方式关键字(这里不尽描述)进行修饰

(nontomic, 后添加空格,在 NSString* 前面均有空格,在 * 后面不需要空格!

// 建议
@property (nonatomic, copy) NSString *userName
// 不建议
@property (nonatomic,copy)NSString * userName
复制代码
  • 命名实例变量

命名实例变量,在变量名前加上 _ 前缀,其他和命名属性一样,建议 BOOL 类型的实例变量采用 _is 开头

@implementation simpleClass {
    BOOL _isShowVip; 
    NSString *_uploadImageUrlString
}
复制代码
  • 命名协议

当前类类名 + Delegate

// STCenterHeaderView

@protocol STCenterHeaderViewDelegate <NSObject>
复制代码
  • 协议方法

去掉项目大写前缀的协议名前面部分+具体方法命名

// STCenterHeaderViewDelegate

- (void)centerHeaderButtonClickWithTag:(NSInteger)tag
复制代码
  • RAC 的命名 调用 RAC 的时候,可以把所有方法实现在一个基础方法中
- (void)pickRac;
复制代码

class 结构

为明确区分 class 中方法类型,使 class 结构更清晰,最快定位到指定方法,特别是在 Controller 中,一旦逻辑稍微复杂,不熟悉代码很难一下子找到。so,这里从几个部分划分成几个模块,并尽量使用以下顺序。在每部分方法前用 pragma mark - <#object#> 注释

#pragma mark - life cycle     // class 生命周期
#pragma mark - set & get 	  // setter & getter 方法
#pragma mark - request		  // 网络请求
#pragma mark - notification	  //  通知
#pragma mark - action 	      // 事件处理(例:按钮点击事件)
#pragma mark - delegate   	  // 代理方法
#pragma mark - setupUI 		  // UI 相关 
#pragma mark - lazy load	  // 懒加载
#pragma mark - delloc
复制代码

代码格式

  • 方法书写

一个典型的 Objective-C 方法应该是这样的:

- (void)uploadImage:(UIImage *)image withToken:(NSString *)token linkAddress:(NSString *)linkAddress
{
  
}
复制代码

-(void)之间应该有一个空格,第一个大括号{单独占一行。

  • 方法调用

注意一点是如果方法有多个参数或者方法过长,那么应该按照 : 来对其分行显示

[self uploadImage:image
        withToken:token
      linkAddress:linkAddress];
复制代码
  • 协议 Protocols

在一个头文件中正确定义一个协议的如下

@class 引用当前类

<>中的协议和类型名之间需要添加空格

默认对协议方法不写修饰符 @required @optional ,即默认为@required ,但特殊情况下协议方法不要求必须实现的,使用 @required 修饰协议方法

协议属性使用 weak 关键字修饰,并且一般统一命名为delegate

#import <UIKit/UIKit.h>
@class STMyWalletHeaderView;

@protocol STMyWalletHeaderViewDelegate<NSObject>

@optional
/** 1-提现 2充值 */
- (void)myWalletHeaderButtonClickWithTag:(NSInteger)tag;

@end
  
@interface STMyWalletHeaderView : UIView

@property (nonatomic, weak) id<STMyWalletHeaderViewDelegate> delegate;

@end
复制代码

项目规范

  • MVC 设计模式
  • UI 控件使用懒加载初始化

建议在整个项目中使用懒加载进行初始化,在初始化中定义好属性(例如定义好 UIButton 控件的属性),如果控件默认会显示在 view 上面则在懒加载中通过 addSubView 添加到 view ,使整个类文件代码更加清晰明朗。

例子:充值按钮的懒加载

-(UIButton *)rechargeButton
{
    if (!_rechargeButton) {
        _rechargeButton = [UIButton buttonWithTitle:@"充值"
                                        atTitleSize:15
                                       atTitleColor:White_Color
                                           atTarget:self
                                           atAction:@selector(buttonClick:)];
        _rechargeButton.backgroundColor = Main_Color;
        _rechargeButton.tag = 2;
        _rechargeButton.layer.masksToBounds = YES;
        _rechargeButton.layer.cornerRadius = 18;
        [self addSubview:_rechargeButton];
    }
    return _rechargeButton;
}
复制代码
  • Masonry 自动布局

建议在 setSubLayouat 方法中进行自动布局,在 viewDidLoad 中调用该方法

#pragma mark -- 布局
-(void)setSubLayout
{
    [self.whiteView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.offset(10);
        make.left.offset(16);
        make.right.offset(-16);
        make.height.offset(216);
    }];
    
    [self.subLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.offset(30);
        make.height.offset(38);
        make.right.equalTo(self.thireLabel.mas_left).offset(-4);
    }];
}
复制代码
  • 枚举定义类型常量

如果要定义一组相关的常量,尽量使用枚举类型(enumerations),枚举类型的命名规则和函数的命名规则相同,建议使用 NS_ENUMNS_OPTIONS 宏来定义枚举类型

从 1001 开始,根据苹果官方解释,0~1000 为苹果 SDK 使用

typedef NS_ENUM(NSInteger, ImagePickState){
    ImagePickStateNormal = 1001, // 系统自带
    ImagePickStateTZI // TZimagePick
};
复制代码
  • 一般使用 Delegate 传值

在界面传值、监听状态等均建议统一使用 Delegate

注释规范

  • 方法注释 快捷键 : Command + Option + /
/**
 加载全景图片

 @param imageName 全景图图片名称
 */
- (void)setImageWithName:(NSString *)imageName;
复制代码
  • 属性注释
/** 创建时间 */
@property (nonatomic, copy) NSString *createTime;
复制代码
  • 使用 #pragma mark - 区分方法
  • 其他

为了别给自己埋坑,或者给后人留条路走,强烈要求在写逻辑,特别是复杂逻辑的时候要写好注释。

工程规范

  • 目录结构

类文件除 AppDelegate 、man.h 外,其他均在 Classes 文件夹中,以模块划分,模块下面分别以 Model 、 View 、Controller 划分不同文件夹

例:

| — Classes
       | — Main  [基础框架]
       | — Home  [首页模块]
              | — Model 
              | — View 
                   | — Cell 
              | — Controller 
       | — Attention  [关注模块]
       | — Message  [消息模块]
       | — Center  [个人中心模块]
       | — Login  [登录注册模块]
复制代码
  • 图片资源

图片资源统一放在 Assets.xcassets 中,并根据模块区分存放不同文件夹

友情链接

1.iOS 切图规范

2.APP 测试方法汇总

猜你喜欢

转载自juejin.im/post/5bff92cbf265da616b106c4e