一、命名规范
1.类的命名
1.1 大驼峰式命名:每个单词的首字母都采用大写字母
例子:MLHomePageViewController
1.2 前后缀要求
自定义控件 使用公司 ML 前缀 ,
ViewController: 使用ViewController做后缀
例子: MLHomeViewController
View: 使用View做后缀
例子:MLAlertView
UITableCell:使用Cell做后缀
例子:MLNewsCell
Protocol: 使用Delegate或者DataSource作为后缀
例子:UITableViewDelegate
UI控件依次类推 ScrollView,TextField, TextView
2.property变量
2.1 小驼峰式命名:第一个单词以小写字母开始,后面的单词的首字母全部大写
例子:@property (strong, nonatomic) NSString *userName;
2.2 控件命名:统一以全称后缀命名的方式:
例如 Button loginButton Label userNameLabel TextField passwordTF TextView commentTextView TableView historyTableView ScrollView scrollView
3.宏命名
3.1 全部大写,单词间用 _ 分隔。
例子:#define THIS_IS_AN_MACRO @"THIS_IS_AN_MACRO"
3.2 宏的位置要在import下面,@interface 的上面
4.枚举
4.1 Enum类型的命名与类的命名规则一致
4.2 Enum中枚举内容的命名需要以该Enum类型名称开头
4.3 使用 typedef NS_ENUM 定义 与swift兼容
例子:
typedef NS_ENUM (NSInteger, AFNetworkReachabilityStatus) {
AFNetworkReachabilityStatusUnknown = -1,
AFNetworkReachabilityStatusNotReachable = 0,
AFNetworkReachabilityStatusReachableViaWWAN = 1,
AFNetworkReachabilityStatusReachableViaWiFi = 2
};
5.Class中方法命名
使用小驼峰规则,用动词命名,第一个单词的首字母小写,其他单词的首字母大写。以下为几种常用方法的命名:
5.1 弹出提示框或者提示信息,命名以 show 开头,
例:showHUD
5.2 按钮点击方法,命名以 控件名+Clicked 结尾,
例:loginBtnClicked
5.3 设置方法,命名以 set 开头,
例:setData
5.4 具有返回值的获取方法,命名以 get开头,
例:getData
5.5 通过异步加载数据的方法,命名以 load(本地数据)/query/request(请求网络数据) 开头,
例:loadData
5.6 布尔型的判断方法,命名以 is 或 has,或具有逻辑意义的单词如 equals,
例:isEmpty
5.7 保存数据相关的方法,命名以 save 开头,
例:saveGoodsData,
5.8 对数据重组的方法,命名以 reset 开头,
例:resetOrderData,
5.9 清除数据相关的方法,命名以 clear/clean/remove 开头,
例:clearUserData,
6. Delegate方法命名
6.1 类的实例必须为回调方法的参数之一, 如
- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
6.2 回调方法的参数只有类自己的情况,方法名要符合实际含义, 如:
- (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView
6.3 以类的名字开头(回调方法存在两个以上参数的情况)以表明此方法是属于哪个类的, 如:
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
6.4 使用did和will通知Delegate已经发生的变化或将要发生的变化, 如:
- (NSIndexPath*)tableView:(UITableView*)tableView willSelectRowAtIndexPath:(NSIndexPath*)indexPath;
- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath;
7. 切图命名:
切图命名:
页面_模块_类别_功能_状态.png
如:home_tab_btn_search_normal.png)
首页_标签栏_按钮_搜索_默认状态.png
常用英文名:
模块:
标签栏 nav 菜单栏 tab 背景 bg 左侧导航 leftbar 启动页面 lanuch 工具栏 tool 主页面 home 列表 list
个人资料porfile 登录 login 注册 regsiter 标题 title
类别:
标志 logo 图标ic 按钮 btn 进度条 progress bar 默认图片 def 分隔图片 div 图片 img 评论 comment
广告 ad 提示信息 msg 弹出 pop 输入框 input 菜单 menu 复选框 chb 单选框rb 下拉 cbb
功能:
搜索 search 收藏 collect 时间 time 音频 audio 视频 viedio 用户 user 排名 ranked 关闭 close
返回 back 编辑 eidt 删除 delete 链接 link 下载 download 注释 note 刷新 refresh 取消 cancel
设置 setting
状态:
默认 normal(nor) 按下 pressed 选中 selected(sel) 不可点击 disabled(dis)
8. 关于UI布局
8.1 使用Interface Builder进行界面布局
8.2 Xib文件的命名与其对应的.h文件保持相同
8.3 Xib或SB文件中控件的必须进行重命名,不允许出现Label ImageView等Xcode缺省命名。
二、类中代码规范
1. import规范
当一个Controller或者一个Class中需要用到不同的类和Define时, 我们应当把#import划分.
划分原则: 哪个Controller或者Class是本Controller或者Class的次级就放在一起, 公共Controller或Class就与之前的空一行, 紧跟着下面.
分隔 用 #pragma mark-
// controller
#import "TripDetailViewController.h"
#import "TripEvaluationViewController.h"
#import "EvaluateViewController.h"
#pragma mark -
// view
#import "HCSStarRatingView.h"
#import "UndealTripHeader.h"
#import "FinishedTripHeader.h"
#import "GPMapAnnotationView.h"
#import "GPMapDriverAnnotationView.h"
// model&tool
#import "GPCancelTripRequest.h"
#import "GPGetTripDetailRequest.h"
#import "GPWebServiceManager.h"
#import "GPEvaluateTripRequest.h"
(建议)需要经常使用的,新建Importer.h 文件,导入到.pch头文件中
#import <UIKit/UIKit.h>
#import<Foundation/Foundation>
//百度地图
//引入base相关所有的头文件
#import//引入地图功能所有的头文件
#import//引入检索功能所有的头文件
#import//引入定位功能所有的头文件
#import//引入计算工具所有的头文件
#import//只引入所需的单个头文件
#import//猿题库网络请求框架
#import "YTKNetworkAgent.h"
#import "HLShadowAndCornerImageView.h"
2. property 声明
2.1 声明位置
在.m文件中最上方,定义空的category进行声明,根据内存管理关键字来划分模块, 且以 "*" 分类对齐(基础数据类型除外),nonatomic 修饰放在最后。 不可在实现类中用大括号的方式申明私有变量,避免这些变量在方法中使用时,与方法的传入参数理解作用域理解混淆 例子:
#import "CodeStandardViewController.h"
// 在这个category(类目)中定义变量和方法
@interface CodeStandardViewController ()
@property (weak, nonatomic) IBOutlet UILabel *priceLabel;
@property (weak, nonatomic) IBOutlet UIImageView *otherInfoImageView;
@property (weak, nonatomic) IBOutlet UILabel *tripPassengerCountLabel;
@property (strong, nonatomic) AspRetrievePasswordView *retrievePassword;
@property (strong, nonatomic) UITextField *foucsTextField;
@property (copy, nonatomic) NSString *brandName;
@property (copy, nonatomic) NSString *brandType;
@property (assign, nonatomic) NSInteger zeroCount;
@property (assign, nonatomic) NSInteger verificationCode;
@end
@implementation CodeStandardViewController
/* 错误 声明
{
NSDictionary *vcConfigDict;
BOOL isInfoViewShown;
}
/*
@end
2.2 使用
在.m中 以 self. 的方式使用,不使用下划线的形式
3.方法规范
3.1在声明函数时"-"与"(type)"必须空一格, 且后面的参数类型与"*"也必须空一格.多个参数冒号对齐。
/**
<#Description#>
@param result <#result description#>
@param mapView <#mapView description#>
@param error <#error description#>
*/
+ (void)showRoute:(BMKDrivingRouteResult *)result
on:(BMKMapView *)mapView
errorCode:(BMKSearchErrorCode)error;
3.2方法与方法之间相隔一行的间距,在函数体内, 如果第一句调用的是系统方法, 可不换行, 如果是自定义的方法(包括if-else和for in), 必须换行.
+ (void)showRoute:(BMKDrivingRouteResult *)result
on:(BMKMapView *)mapView
errorCode:(BMKSearchErrorCode)error {
NSArray* overlaysArray = [NSArray arrayWithArray:mapView.overlays];
[mapView removeOverlays:overlaysArray];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
4. if-else规范
4.1 使用结构清晰的排版方式, if-else语句与方法名空行, return语句可以不用空行.
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
// code body
}
return self;
}
4.2 if-else内部也必须跟着空行, 在else之后的"}"可不空行.
- (void)viewDidLoad {
[super viewDidLoad];
if (age < 0) {
// Code Body
}
}
4.3 if-else超过四层的时候, 就要考虑重构, 多层的if-else结构很难维护。 合理使用ifelse, 当某个场景只需满足一个条件才能进入if-else时, 应该把if-else抽成一个模块。
- (void)viewDidLoad {
[super viewDidLoad];
if (age < 0) {
NSLog(@"这是错误的年龄");
return;
}
NSLog(@"现在时%ld岁", (long)age):
}
4.4 if-else必须加"{}"符号, 哪怕是一行判断.
5. 运算符规范
5.1 一元运算符和参数之间不放置空格, 比如"!"非运算符, "&"安位与, "|"安位或.
BOOL isOpen = true;
BOOL isClose = !isOpen;
5.2 二元运算符和参数之间要有空格, 如赋值号"="左右各留一个空格.
self.myString = @"mySring";
5.3 三目运算符和参数之间必须得有空格, 如判断符"?"结果符":"
NSInteger userAge = @"Man" ? 18 : 19;
6. NSDictionary
当NSDictionary里的Key : Value过多时, 应拆分为多行显示, 并以 ":" 对齐
NSDictionary *people = @{@"xiaoming" : 18,
@"xiaohong" : 19,
@"xiaowang" : 20};
7. NSArray(视情况)
当NSArray里的元素过多时, 应拆分为多行显示, 并以第一个元素对齐.
NSArray *nameArray = @[@"小明",@"小红",@"小王"];
8. #pragma mark -
对于相同性质的属性、方法使用 mark 分组
#pragma mark - lift cycle
#pragma mark - IBAction
9.TODO 规范
对于多人开发的项目,// TODO后 必须加上作者
10. 枚举
项目中不允许直接使用数字代替
typedef NS_ENUM(NSInteger, TripStatus) {
TripStatusNotPublish = 0,
// 已发布
TRIP_STATUS_PUBLISHED = 10,
// 重派单
TRIP_STATUS_REDISPACH = 15,
// 已派单
TRIP_STATUS_DISPACHED = 20,
// 已接单
TRIP_STATUS_RECEIVED = 30,
// 正在接
TRIP_STATUS_PICKING = 33,
// 已接到
TRIP_STATUS_PICKEDUP = 35,
// 已出发
TRIP_STATUS_STARTED = 40,
// 已完成
TRIP_STATUS_DONE = 50,
// 已取消
TRIP_STATUS_CANCELED = -1
};
三、注释规范
最好的代码是不需要注释的 尽量通过合理的命名
良好的代码把含义表达清楚 在必要的地方添加注释
注释需要与代码同步更新
如果做不到命名尽量的见名知意的话,就可以适当的添加一些注释或者mark.
1. 文件头
与公司的要求统一
1.1 必须出现 文件创建者, 创建日期,创建者联系方式
//
// UserCenterViewController.h
// GuaGuaPassenger
//
// Created by Wang Hai Long (wanghailong096@sunfit.cn) on 10/10/2016.
// Copyright © 2016 Sunfit. All rights reserved.
2. 属性注释
例子:
/** 学生 */
@property (nonatomic, strong) Student *student;
3. 方法声明注释:
以下情况必须加注释
3.1 接口中定义的所有方法
3.2 抽象类中自定义的抽象方法
3.3 抽象父类的自定义公用方法
3.4 工具类的公用方法
option+command+? 自动生成注释格式
/**
* @brief 登录验证
*
* @param personId 用户名
* @param password 密码
* @param complete 执行完毕的block
*
* @return
*/
+ (void)loginWithPersonId:(NSString *)personId
password:(NSString *)password
complete:void (^)(CheckLogon *result))complete;