iOS代碼規(guī)范總結(jié)
一侮东、命名規(guī)則:
1圈盔、文件名:全小寫(xiě),使用下劃線(xiàn)分割單詞悄雅,如
lib_st_idcard_scanner,
face_head.jpg .
2驱敲、類(lèi)名:大寫(xiě)開(kāi)頭,駝峰原則煤伟,如
STIDCard,
STIDCardScanner.
3癌佩、變量名:小寫(xiě)開(kāi)頭,駝峰原則便锨,類(lèi)型做為前綴围辙,如
-
局部變量:
(int) iCount, bFocus, fScore, strName, imgFace, arrFaces;
-
成員變量:下劃線(xiàn)開(kāi)頭
_iTotalNumber, _strFilePath;
函數(shù)名:動(dòng)詞小寫(xiě)開(kāi)頭,駝峰原則放案,
-
自定義函數(shù):
setDetailItem ;
-
系統(tǒng)函數(shù):
viewDidLoad; didReceiveMemoryWarning;
-
界面響應(yīng)函數(shù)(點(diǎn)擊button的響應(yīng)):
on+按鈕名稱(chēng)姚建,onScan, onHome;
4、宏:
方法一:靜態(tài)標(biāo)志+常量標(biāo)志+數(shù)據(jù)類(lèi)型+變量名
static const NSTimeInterval kAnimationDuratin = 0.3吱殉;
解析其好處:
- 用這種方式定義的常量既包含了類(lèi)型信息掸冤,也不會(huì)額外耗費(fèi)預(yù)處理的資源厘托;
- 若試圖修改const修飾符所聲明的變量,那么編譯器就會(huì)報(bào)錯(cuò)稿湿,而static則表明此變量?jī)H在定義此變量的編譯單元中可見(jiàn)铅匹。
方法二:
.h文件中
extern NSString *const ConstString; // extern表示聲明一個(gè)全局變量,也可修飾函數(shù)饺藤。
.m文件中
NSString *const ConstString = @"a string";
解析:
使用#define ANIMATION_DURATION 0.3
會(huì)遇到的問(wèn)題:
- 這個(gè)常量沒(méi)有類(lèi)型信息包斑,光從代碼字面上只可以看出和動(dòng)畫(huà)時(shí)間有關(guān);
- 預(yù)處理過(guò)程中會(huì)把碰到的所有
ANIMATION_DURATION
一律替換成0.3涕俗,這樣的話(huà)假如這個(gè)宏定義在了一個(gè)類(lèi)的.h文件中罗丰,那么在其他導(dǎo)入了這個(gè).h文件的類(lèi)文件中,所有的ANIMATION_DURATION
都會(huì)被替換再姑; - 使用宏定義的常量可能會(huì)無(wú)意中遭人修改萌抵,從而導(dǎo)致應(yīng)用程序中各個(gè)部分所使用的值互不相同。
二元镀、代碼注釋?zhuān)?/h2>
1绍填、作用:
- 減少同事之間的溝通成本;
- 快速恢復(fù)代碼記憶凹联;
- 快速生成文檔沐兰。
2哆档、使用規(guī)則:
1蔽挠、實(shí)例變量和成員變量(兩者注釋方法相似,以實(shí)例變量介紹為主):
- 主要是的采用方式:
///view 第一種樣式注視
@property (strong, nonatomic) UIView * view1;
效果如下:
- 其它的方式:
-
方式一:
-
/** view 第二種樣式注視 */
@property (strong, nonatomic) UIView *view2;
- 方式二:
-
@property (strong, nonatomic) UIView *view2; /** view 第三種樣式注視 */
2瓜浸、對(duì)象方法或類(lèi)方法:
/**
* 通過(guò)圖片來(lái)提取人臉特征,ps: 此過(guò)程需 detector
* @param image 包含有人臉的圖片
* @param hDetector detector句柄,用來(lái)檢測(cè)是否存在人臉
* @param hVerify verify句柄,用來(lái)提取人臉特征
* @return 人臉特征
*/
+ (NSData *)extractFeatureWithImage:(UIImage *)image withDetector:(cv_handle_t)hDetector withVerify:(cv_handle_t)hVerify;
效果如下:
更好的代碼風(fēng)格
代碼寬度
一般我們所寫(xiě)的代碼最好不要太長(zhǎng)澳淑,目前主流的代碼規(guī)范都推薦代碼寬度保持在 80 為宜,這么做當(dāng)然是有歷史原因插佛,但在現(xiàn)在也還是有其實(shí)用價(jià)值的杠巡。因?yàn)閷⒋a寬度限制在 80,是在需要打印代碼的時(shí)候雇寇,完美適配 A4 紙的寬度氢拥。即使只是將代碼貼在個(gè)人博客或在線(xiàn)網(wǎng)站上,這也是最適合代碼閱讀的寬度锨侯。當(dāng)使用大屏顯示器編程時(shí)嫩海,這個(gè)寬度也是很適合分屏工作的。
三囚痴、自定義公共類(lèi):
我司移動(dòng)開(kāi)發(fā)組的代碼主要有g(shù)it倉(cāng)庫(kù)統(tǒng)一管理叁怪,同時(shí)為了方便開(kāi)發(fā),已將常用的公共庫(kù)做了統(tǒng)一管理深滚,主要集中在iOSLibrary倉(cāng)庫(kù)中上.
1奕谭、STCommon
/**
* 判斷當(dāng)前Wi-Fi是否可用
* @return BOOL,返回BOOL值
*/
+ (BOOL)st_isWiFiEnabled;
/**
* 獲取當(dāng)前設(shè)備的IP地址
* @return NSString,設(shè)備IP涣觉,eg:192.168.2.58
*/
+ (NSString *)st_getDeviceWiFiIP;
/**
* 當(dāng)前應(yīng)用的內(nèi)存使用情況
* @return double 浮點(diǎn)數(shù), eg:23.3M
*/
+ (double)st_getUsedMemory;
/**
* 當(dāng)前應(yīng)用的CPU使用情況
* @return float 浮點(diǎn)數(shù),百分比
*/
+ (float)st_getCpuUsage;
/**
* 字符串轉(zhuǎn)換成字典
* @param stringJson 輸入字符串
* @return NSDictionary,字典
*/
+ (NSDictionary *)st_dictionaryWithJsonString:(NSString *)stringJson;
#warning 字典轉(zhuǎn)換成字符串
/**
* 驗(yàn)證輸入手機(jī)號(hào)格式是否正確
* @param mobileNum 輸入的手機(jī)號(hào)
* @return BOOL,返回BOOL值
*/
+ (BOOL)st_isMobileNumber:(NSString *)mobileNum;
/**
* 驗(yàn)證輸入郵箱號(hào)格式是否正確
* @param Email 輸入的郵箱
* @return BOOL
*/
+ (BOOL)st_isEmail:(NSString *)Email;
/**
* 獲取當(dāng)前設(shè)備的方向
* @return UIDeviceOrientation.
*/
+ (UIDeviceOrientation)st_getDeviceOrientation;
/**
* 判斷當(dāng)前設(shè)備是否是iPad
* @return BOOL
*/
+ (BOOL)st_isiPad;
/**
* 判斷當(dāng)前設(shè)備類(lèi)型判斷,根據(jù)屏幕的Size
* @return Device_ENUM
*/
+ (Device_ENUM)st_getDeviceTypeWithSize:(CGSize)sizeScreen;
/**
* 判斷當(dāng)前設(shè)備類(lèi)型判斷,根據(jù)屏幕的Rect
* @return Device_ENUM
*/
+ (Device_ENUM)st_getDeviceTypeWithRect:(CGRect)rect;
2、PhotoTool
/**
* 獲取相冊(cè)膠卷中最后一張照片
*/
+ (void)pt_getLastestPhoto:(void(^)(UIImage *imgLastestPhoto,NSError *error))block;
/**
* 判斷是否相機(jī)授權(quán)
* @return BOOL
*/
+ (BOOL)pt_isAuthCamera;
/**
* 判斷是否相冊(cè)授權(quán)
* @return BOOL
*/
+ (BOOL)pt_isAuthPhotoLibrary;
/**
* 將視頻流數(shù)據(jù)轉(zhuǎn)化為圖片
* @param sampleBuffer 視頻流數(shù)據(jù)buffer
* @return 圖片
*/
+ (UIImage *)pt_imageFromSampleBuffer:(CMSampleBufferRef)sampleBuffer;
/**
* 將圖片轉(zhuǎn)化為無(wú)符號(hào)字符指針,主要用于FaceSDK人臉檢測(cè)
* @param image 圖片
* @return 無(wú)符號(hào)字符指針
*/
+ (unsigned char *)pt_getBGRAfromImage:(UIImage *)image;
/**
* 放大血柳、縮小圖片
* @param size 需要的圖片大小
* @param image 源圖片
* @return UIImage官册,處理后的圖片
*/
+ (UIImage *)pt_imageScaledSize:(CGSize)size originalImg:(UIImage *)image;
/**
* 對(duì)圖片進(jìn)行裁剪
* @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會(huì)不會(huì)與當(dāng)前View交錯(cuò)、重疊
* @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
四昆汹、第三方庫(kù)類(lèi):
1、網(wǎng)絡(luò)請(qǐng)求類(lèi)
- AFNetworking 下載地址:AFNetworking
2婴栽、圖片下載類(lèi)
- SDWebImage 下載地址:SDWebImage
3满粗、上下拉刷新
- MJRefresh 下載地址:MJRefresh
4、數(shù)據(jù)模型解析
- MJExtension 下載地址:MJExtension
5愚争、近場(chǎng)通信
- CocoaAsyncSocket 下載地址:CocoaAsyncSocket
6映皆、第三方工具
- 友盟
- 百度地圖
- 提示框(LCProgressHUD)