0.写在前面
- 本文中所提到的
规范
与不规范
大部分其实没有明显的优劣之分只是一种偏好,但出于管理统一,以及他人维护成本的考量.也请各位务必遵守此份规范.
1.命名规范
-
1.1使用
驼峰
或下划线
来表示单词间隔:正常情况下建议使用驼峰,少数情况如第三方代码或数据模型可以使用下划线.
驼峰:userName
下划线:user_name
-
1.2首字母大小写:
类名
首字母大写,变量名
、方法名
、属性名
、首字母小写.
类名: UserModel.h
变量名:redView
方法名:- (void)doSomething
属性名:@property (nonatomic, copy) NSString *name;
-
1.3前缀:
类名
的前缀须以YS开头.
类名前缀 - 以此方法快速设置前缀,如下图所示在
Class Prefix
内填入YS
前缀自动填充
=- 1.4后缀:对象后缀需要做到见后缀知类型
UIViewController: XXXViewController
UIView: XXXView
UILabel: XXXLabel
- 1.5缩写推荐使用缩写可以使代码更简洁紧凑,只采纳有广为人知含义的缩写,单请勿自行创造缩写.
规范: info = information
UI = userinterface
msg = message
dict = dictionary
不规范: psn = person
2.在类的头文件中尽量少引用其他头文件
- 有时,类A需要将类B的实例变量作为它公共API的属性。这个时候,我们不应该引入类B的头文件,而应该使用向前声明(forward declaring)使用class关键字,并且在A的实现文件引用B的头文件。
.h
#import <Foundation/Foundation.h>
@class YSDog;
@interface YSPerson : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSUInteger age;
@property (nonatomic, strong) YSDog *dog;
@end
.m
#import "YSPerson.h"
#import "YSDog.h"
@implementation YSPerson
@end
2.编码规范
- 2.1.多用字面量语法
规范:NSString *str = @"123";
NSArray *array = @[@1, @2, @3];
array[1];
不规范:NSString *str = [NSString stringWithString:@"123"];
NSArray *array = [NSArray arrayWithObjects:@1, @2, @3, nil];
[array objectAtIndex:1];
- 2.2.多用类型常量,少用#define预处理命令
规范:
//header file
extern NSString *const kNotificationString;
//implementation file
NSString *const kNotificationString = @"Finish Download";
不规范:
#define kNotificationString @"Finish Download"
-
2.3.枚举写法
枚举
有多种写法,但是请写成这样(NS_OPTIONS
同理):
typedef NS_ENUM(NSInteger, YSPersonGender) {
YSPersonGenderMale,
YSPersonGenderFemale
};
- 2.4适当使用空格
- property后有空格
- 内存语义之间有空格
- 类型(NSArray)之后有空格
- *和属性名之间无空格
@property (nonatomic, copy, readonly) NSArray *persons;
- 运算符两侧有空格
规范: a = b + c;
不规范: a=b+c;
-
2.5适当使用备注
代码注释
使用XCode自带的代码注释功能键option + command + /进行注释
-
2.6对method进行分组
可以参考我的分组方式,也可自行修改.(但是set&get包括懒加载)请写在最下面
#pragma mark - 生命周期
#pragma mark - 重写
#pragma mark - 初始化
#pragma mark - 方法
#pragma mark - 事件
#pragma mark - 网络请求
#pragma mark - 数据源
#pragma mark - 代理
#pragma mark - Get&Set
3.Xcode
- 3.1文件管理
-
xcode
创建文件夹不要创建虚拟文件夹,应创建物理文件夹,便于查找文件位置(及Xcode里的项目树,和项目文件树结构一致).
XCode项目树
项目文件树 - 请确保所有项目的项目根目录里仅有
Podfile
+Podfile.lock
+Pods\
+projname\
+projname.xcodeproj
+projname.xcworkspace
6个文件&文件夹
-
3.2文件管理详解
项目树详情
-
3.2.1YSGeneral:公司内部封装的一些代码按需取用;
-
3.2.2Class:项目代码主体部分;
-
AppDelegate:
AppDelegate
及其分类 -
Conteroller:各页面控制器及其分类及其专用
View
-
Api:项目所有接口(详情参考
4.Api
) - Model:项目所有模型
-
View:通用不依赖特定
Conteroller
的View
. - Too:l工具类
-
AppDelegate:
-
3.2.3Extension:非Pods导入的第三方代码
-
3.2.4Resource:根路径下存放
Assets.xcassets
+pch
+Info.plist
UseLess
下存放ViewController.h .m
+Main.storyboard
+LaunchScreen.storyboard
+main.m
以上目录可以根据功能再进行分级
4.Api
项目中所有Api均已单独模型形式进行封装.Api的写法请如下.BaseApi
的代码请参考YSGeneral
#import "BaseApi.h"
@interface YSEditPasswordApi : BaseApi
/**
.h
修改密码Api
1.6 修改密码的接口(完成)
@param verifyCode 验证码(选填)
@param password 密码
@param callback 回调
*/
- (void)editPasswordWithVerifyCode:(NSString *)verifyCode
password:(NSString *)password
callback:(ApiRequestCallBack)callback;
@end
.m
#import "YSEditPasswordApi.h"
@implementation YSEditPasswordApi
- (void)editPasswordWithVerifyCode:(NSString *)verifyCode
password:(NSString *)password
callback:(ApiRequestCallBack)callback{
// 参数拼接
self.params[kAPI_NAME] = @"shipinhuiyi.user.editPassword";
self.params[@"verify_code"] = verifyCode;
self.params[@"new_password"] = [HttpSign doMD5:password];
// Api调用成功之后的外部回调
self.callback = callback;
[self doRequestWithSuccessBlock:^(id resultData) {
// Api调用成功之后的内部回调
}];
}
@end
网友评论