iOS代码规范总结
一、命名规则:
1、文件名:全小写,使用下划线分割单词,如
lib_st_idcard_scanner,
face_head.jpg .
2、类名:大写开头,驼峰原则,如
STIDCard,
STIDCardScanner.
3、变量名:小写开头,驼峰原则,类型做为前缀,如
-
局部变量:
(int) iCount, bFocus, fScore, strName, imgFace, arrFaces;
-
成员变量:下划线开头
_iTotalNumber, _strFilePath;
函数名:动词小写开头,驼峰原则,
-
自定义函数:
setDetailItem ;
-
系统函数:
viewDidLoad; didReceiveMemoryWarning;
-
界面响应函数(点击button的响应):
on+按钮名称,onScan, onHome;
4、宏:
方法一:静态标志+常量标志+数据类型+变量名
static const NSTimeInterval kAnimationDuratin = 0.3;
解析其好处:
- 用这种方式定义的常量既包含了类型信息,也不会额外耗费预处理的资源;
- 若试图修改const修饰符所声明的变量,那么编译器就会报错,而static则表明此变量仅在定义此变量的编译单元中可见。
方法二:
.h文件中
extern NSString *const ConstString; // extern表示声明一个全局变量,也可修饰函数。
.m文件中
NSString *const ConstString = @"a string";
解析:
使用#define ANIMATION_DURATION 0.3
会遇到的问题:
- 这个常量没有类型信息,光从代码字面上只可以看出和动画时间有关;
- 预处理过程中会把碰到的所有
ANIMATION_DURATION
一律替换成0.3,这样的话假如这个宏定义在了一个类的.h文件中,那么在其他导入了这个.h文件的类文件中,所有的ANIMATION_DURATION
都会被替换; - 使用宏定义的常量可能会无意中遭人修改,从而导致应用程序中各个部分所使用的值互不相同。
二、代码注释:
1、作用:
- 减少同事之间的沟通成本;
- 快速恢复代码记忆;
- 快速生成文档。
2、使用规则:
1、实例变量和成员变量(两者注释方法相似,以实例变量介绍为主):
- 主要是的采用方式:
///view 第一种样式注视
@property (strong, nonatomic) UIView * view1;
效果如下:
- 其它的方式:
-
方式一:
-
/** view 第二种样式注视 */
@property (strong, nonatomic) UIView *view2;
- 方式二:
-
@property (strong, nonatomic) UIView *view2; /** view 第三种样式注视 */
2、对象方法或类方法:
/**
* 通过图片来提取人脸特征,ps: 此过程需 detector
* @param image 包含有人脸的图片
* @param hDetector detector句柄,用来检测是否存在人脸
* @param hVerify verify句柄,用来提取人脸特征
* @return 人脸特征
*/
+ (NSData *)extractFeatureWithImage:(UIImage *)image withDetector:(cv_handle_t)hDetector withVerify:(cv_handle_t)hVerify;
效果如下:
更好的代码风格
代码宽度
一般我们所写的代码最好不要太长,目前主流的代码规范都推荐代码宽度保持在 80 为宜,这么做当然是有历史原因,但在现在也还是有其实用价值的。因为将代码宽度限制在 80,是在需要打印代码的时候,完美适配 A4 纸的宽度。即使只是将代码贴在个人博客或在线网站上,这也是最适合代码阅读的宽度。当使用大屏显示器编程时,这个宽度也是很适合分屏工作的。
三、自定义公共类:
我司移动开发组的代码主要有git仓库统一管理,同时为了方便开发,已将常用的公共库做了统一管理,主要集中在iOSLibrary仓库中上.
1、STCommon
/**
* 判断当前Wi-Fi是否可用
* @return BOOL,返回BOOL值
*/
+ (BOOL)st_isWiFiEnabled;
/**
* 获取当前设备的IP地址
* @return NSString,设备IP,eg:192.168.2.58
*/
+ (NSString *)st_getDeviceWiFiIP;
/**
* 当前应用的内存使用情况
* @return double 浮点数, eg:23.3M
*/
+ (double)st_getUsedMemory;
/**
* 当前应用的CPU使用情况
* @return float 浮点数,百分比
*/
+ (float)st_getCpuUsage;
/**
* 字符串转换成字典
* @param stringJson 输入字符串
* @return NSDictionary,字典
*/
+ (NSDictionary *)st_dictionaryWithJsonString:(NSString *)stringJson;
#warning 字典转换成字符串
/**
* 验证输入手机号格式是否正确
* @param mobileNum 输入的手机号
* @return BOOL,返回BOOL值
*/
+ (BOOL)st_isMobileNumber:(NSString *)mobileNum;
/**
* 验证输入邮箱号格式是否正确
* @param Email 输入的邮箱
* @return BOOL
*/
+ (BOOL)st_isEmail:(NSString *)Email;
/**
* 获取当前设备的方向
* @return UIDeviceOrientation.
*/
+ (UIDeviceOrientation)st_getDeviceOrientation;
/**
* 判断当前设备是否是iPad
* @return BOOL
*/
+ (BOOL)st_isiPad;
/**
* 判断当前设备类型判断,根据屏幕的Size
* @return Device_ENUM
*/
+ (Device_ENUM)st_getDeviceTypeWithSize:(CGSize)sizeScreen;
/**
* 判断当前设备类型判断,根据屏幕的Rect
* @return Device_ENUM
*/
+ (Device_ENUM)st_getDeviceTypeWithRect:(CGRect)rect;
2、PhotoTool
/**
* 获取相册胶卷中最后一张照片
*/
+ (void)pt_getLastestPhoto:(void(^)(UIImage *imgLastestPhoto,NSError *error))block;
/**
* 判断是否相机授权
* @return BOOL
*/
+ (BOOL)pt_isAuthCamera;
/**
* 判断是否相册授权
* @return BOOL
*/
+ (BOOL)pt_isAuthPhotoLibrary;
/**
* 将视频流数据转化为图片
* @param sampleBuffer 视频流数据buffer
* @return 图片
*/
+ (UIImage *)pt_imageFromSampleBuffer:(CMSampleBufferRef)sampleBuffer;
/**
* 将图片转化为无符号字符指针,主要用于FaceSDK人脸检测
* @param image 图片
* @return 无符号字符指针
*/
+ (unsigned char *)pt_getBGRAfromImage:(UIImage *)image;
/**
* 放大、缩小图片
* @param size 需要的图片大小
* @param image 源图片
* @return UIImage,处理后的图片
*/
+ (UIImage *)pt_imageScaledSize:(CGSize)size originalImg:(UIImage *)image;
/**
* 对图片进行裁剪
* @param rect 需要的图片Rect
* @param image 源图片
* @return UIImage,处理后的图片
*/
+ (UIImage *)pt_imageCropedWithRect:(CGRect)rect originalImg:(UIImage *)image;
/**
* 将图片裁剪成圆形
* @param borderWidth 裁剪的宽度
* @param bgColor 背景颜色
* @return UIImage,处理后的图片
*/
+ (UIImage *)pt_imageCircledWithBorderWidth:(CGFloat)borderWidth bgColor:(UIColor *)bgColor originalImg:(UIImage *)imageOriginal;
3、NSObject+STExtension
- UIView
@property (assign, nonatomic) CGFloat st_width;
@property (assign, nonatomic) CGFloat st_height;
@property (assign, nonatomic) CGFloat st_x;
@property (assign, nonatomic) CGFloat st_y;
@property (assign, nonatomic) CGFloat st_centerX;
@property (assign, nonatomic) CGFloat st_centerY;
@property (assign, nonatomic) CGFloat st_right;
@property (assign, nonatomic) CGFloat st_bottom;
@property (assign, nonatomic) CGSize st_size;
+ (instancetype)st_viewFromXib;
/**
* 判断View会不会与当前View交错、重叠
* @param view 需要判断的View
* @return BOOL,返回BOOL值
*/
- (BOOL)isIntersectsRectWithView:(UIView *)view;
/**
* 将一张图片作为背景
* @param str 图片的名字
*/
- (instancetype)addsetBackgroundImageName:(NSString *)str;
- UITextField
///占位文字颜色
@property (strong, nonatomic) UIColor *placeholderColor;
- UIColor
+ (UIColor *)colorWithRGBHex:(UInt32)hex;
+ (UIColor *)colorWithRGBHex:(UInt32)hex r:(float)fAlpha;
4、FaceSDKTool
四、第三方库类:
1、网络请求类
- AFNetworking 下载地址:AFNetworking
2、图片下载类
- SDWebImage 下载地址:SDWebImage
3、上下拉刷新
- MJRefresh 下载地址:MJRefresh
4、数据模型解析
- MJExtension 下载地址:MJExtension
5、近场通信
- CocoaAsyncSocket 下载地址:CocoaAsyncSocket
6、第三方工具
- 友盟
- 百度地图
- 提示框(LCProgressHUD)