iOS(Objective-C)编码规范
本文件旨在统一****iOS方向编码规范。增强代码可读性,便于后期维护。
一、头文件的导入(#import)
写法模板
#import "当前类头发文件"
#import <系统库>
#import <第三方库>
#import “Controller"
#import “View"
#import "Model"
#import "Others"
尽量按照先系统类、第三方类后 Controller、View、Model、Others的顺序导入,中间不能有空格。
建议的写法
#import "PTWFromeViewController.h"
#import
#import "RoadKit.h"
#import "PTWEditEvalController.h"
#import "PTWDetailController.h"
#import “PTWPeoEditController.h"
#import "UserSelectView.h"
#import "FilesEditView.h"
#import "BillSafetyCell.h"
#import "PTWPeopleCell.h"
#import “BillSolutionDialog.h"
#import "PTWEvaluateModel.h"
#import "PTWApprovalModel.h"
#import "PTWDisclosureModel.h"
#import "BillSignModel.h"
#import “UserDefaultHepler.h"
二、@Class的写法
在.h文件中尽量使用@class,引用头文件
写法模板
@class class1, class2;
建议的写法
@class UIView, UIImage;
三、@Interface的写法
写法模板
@interface 类名 : 父类 <协议1, 协议2>
@interface和类名中间一个空格,类名后加空格 “ : ” 之后空格加上父类加空格加协议。
建议的写法
@interface AppDelegate : UIResponder <UITableViewDataSourse>
不建议的写法
@interface AppDelegate:UIResponder
四、@property的写法
写法模板
@property(关键词, 关键词) 类 *变量名称; // 注释
关键词用,空格分割 类前后空格
建议的写法
@property (nonatomic, copy) NSString *productID; //产品标识
@property (nonatomic, copy) NSString *status; //状态
不建议的写法
@property (nonatomic,copy) NSString * productID; //产品标识
@property (nonatomic,copy)NSString * status; //状态
*五、类的功能模块建议按以下方式分组
写法模板
view的生命周期方法
初始化方法
网络请求
各类代理
按钮点击
自定义方法
set/get方法
对于网络请求,做到回调方法尽量跟在请求下面。对于多次调用的同一请求,用方法包起来,放到网络请求部分内,偶尔突然使用的请求可以直接放在发起的位置。
建议的写法
view的生命周期方法(此mark不用写)
#pragma mark - setup
#pragma mark - network
#pragma mark - xxxx
#pragma mark - actions
#pragma mark - accessory
#pragma mark - setter and getter
六、enum的定义
对应的enum写到对应的类中,方便寻找和使用
使用NS _ ENUM和NS _ OPTIONS进行定义
建议的写法
typedef NS_ENUM(NSInteger, UIViewAnimationCurve) {
UIViewAnimationCurveEaseInOut, // slow at beginning and end
UIViewAnimationCurveEaseIn, // slow at beginning
UIViewAnimationCurveEaseOut, // slow at end
UIViewAnimationCurveLinear,
};
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
UIViewAutoresizingNone = 0,
UIViewAutoresizingFlexibleLeftMargin = 1 << 0,
UIViewAutoresizingFlexibleWidth = 1 << 1,
UIViewAutoresizingFlexibleRightMargin = 1 << 2,
UIViewAutoresizingFlexibleTopMargin = 1 << 3,
UIViewAutoresizingFlexibleHeight = 1 << 4,
UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};
不建议的写法
typedef enum {
GBAppRunDeveloperModeDebug,
GBAppRunDeveloperModePreRelease,
GBAppRunDeveloperModeRelease
}GBAppRunDeveloperMode;
七、格式和换行
建议的写法
if (user.isHappy) {
//Do something
} else {
//Do something else
}
不建议的写法
if (user.isHappy)
{
//Do something
}
else {
//Do something else
}
八、写直观的代码
写代码有一条重要的原则:如果有更加直接,更加清晰的写法,就选择它(即使它有时候看起来更长,更笨,也一样选择它)
建议的写法
- (void)checkUserAuthentication {
if (![YJRuntime sharedInstance].currentUser.tpStatus) {
// TODO:去实名认证
return;
}
if (![YJRuntime sharedInstance].currentUser.payPwdStatus) {
// TODO:去设置支付密码
return;
}
if (![YJRuntime sharedInstance].currentUser.bankcardStatus) {
// TODO:去绑定银行卡
return;
}
// TODO: ...
}
不建议的写法
if ([YJRuntime sharedInstance].currentUser.tpStatus) {
if ([YJRuntime sharedInstance].currentUser.payPwdStatus) {
if ([YJRuntime sharedInstance].currentUser.bankcardStatus) {
// TODO: ...
} else {
// TODO:去绑定银行卡
}
} else {
// TODO:去设置支付密码
}
} else {
// TODO:去实名认证
}
九、其它
1. 方法命名的规范
如果不是写初始化方法不要用init进行开头
如果不是属性的set方法不要用set作为方法的前缀
按钮方法使用按钮名+Click的方式或+DoubleClick
建议的写法
- (void)saveButtonClick:(UIButton *)button {}
2. 控件命名的规范
一定不要单单用首字母简写命名控件(特殊意义的除外,如WTO、RMB等),并且名字后一定要加上控件类型,例如: UILabel结尾加上Label,UIImageView结尾记上ImageView。
建议的写法
@property(nonatomic, strong) UILabel *userNameLabel;
不建议的写法
@property(nonatomic, strong) UILabel *userName;
3. 局部变量
局部的变量在要初始化时,尽量设置默认值(对于一些对象判断是否赋值可以不进行初始化。使用驼峰命名法,命名变量。
4. block的命名
尽量和苹果的命名一致使用completion,也可用Block命名作为参数名结尾。
建议的写法
typedef void(DidUpdateViewWithCompletionHandle)()
不建议的写法
typedef void(DidUpdateViewWithCallBack)()
5. 对于一些状态的判断,使用枚举表示不同的状态
尽量少用根据数字来直接判断不同的状态
建议的写法
typedef NS_ENUM(NSUInteger, HomeViewState) {
HomeViewStateNoData,
HomeViewStateFailure,
HomeViewStateItemList,
HomeViewStateBannerList
};
switch(state) {
case HomeViewStateNoData : {
//显示没数据
break;
}
case HomeViewStateFailure : {
//显示请求错误
break;
}
case HomeViewStateItemList : {
//显示商品的列表
break;
}
case HomeViewStateBannerList : {
//显示banner列表
break;
}
default :
break;
}
不建议的写法
if(state == 0) {
//显示没数据
} else if(state == 1) {
//显示请求错误
} else if(state == 2) {
//显示商品的列表
} else if(state == 3) {
//显示banner列表
} else {
}
此规范为制定阶段可随时更改,欢迎提出合理建议。