Objective-C編程中語(yǔ)句和變量的一些編寫(xiě)規(guī)范建議
語(yǔ)句
條件語(yǔ)句
條件語(yǔ)句體應(yīng)該總被大括號(hào)包圍。只有一行代碼最好也加上,否則會(huì)帶來(lái)安全隱患。
// 推薦
if (!error) {
return success;
}
// 不推薦
if (!error)
return success;
if (!error) return success;
尤達(dá)表達(dá)式(Yoda)
不要使用尤達(dá)表達(dá)式。(名字起源于星球大戰(zhàn)中尤達(dá)大師的講話方式,總是用倒裝的語(yǔ)序)
// 推薦
if ([myValue isEqual:@42]) { ...
// 不推薦
if ([@42 isEqual:myValue]) { ...
nil和BOOL的檢查
一些人喜歡用這樣的方式來(lái)檢查nil:
if (nil == myValue) { ...
這樣做可以避開(kāi)少些一個(gè)"=“的錯(cuò)誤,因?yàn)橐坏┥賹?xiě)一個(gè)”=“,那么nil是不能被賦值的,編譯器會(huì)報(bào)錯(cuò)。
但是前面提到,最好不要使用尤達(dá)表達(dá)式。所以更好的解決方法是用”!”來(lái)完成nil和BOOL的檢查。
// 推薦
if (someObject) { ...
if (![someObject boolValue]) { ...
if (!someObject) { ...
// 不推薦
if (someObject == YES) { ... // Wrong
if (myRawValue == YES) { ... // Never do this.
if ([someObject boolValue] == NO) { ...
不要嵌套多個(gè)if語(yǔ)句
不要嵌套多個(gè)if語(yǔ)句,而是使用多個(gè)return來(lái)避免增加復(fù)雜度,并提高代碼可讀性。
也就是說(shuō),在一個(gè)方法中,重要的部分盡量不要放在if語(yǔ)句中,而是將”其它情況”放在if中。
// 推薦
- (void)someMethod {
if (![someOther boolValue]) {
return;
}
//Do something important
}
// 不推薦
- (void)someMethod {
if ([someOther boolValue]) {
//Do something important
}
}
復(fù)雜的表達(dá)式
當(dāng)一個(gè)判斷條件很復(fù)雜時(shí),應(yīng)該將它們提取出來(lái)賦值給一個(gè)BOOL變量。
BOOL nameContainsSwift = [sessionName containsString:@"Swift"];
BOOL isCurrentYear = [sessionDateCompontents year] == 2014;
BOOL isSwiftSession = nameContainsSwift && isCurrentYear;
if (isSwiftSession) {
// Do something very cool
}
三元運(yùn)算符
三元運(yùn)算符要保證可讀性。
// 推薦
result = a > b ? x : y;
// 不推薦
result = a > b ? x = c > d ? c : d : y;
當(dāng)三元運(yùn)算符的第二個(gè)參數(shù)(if 分支)返回和條件語(yǔ)句中已經(jīng)檢查的對(duì)象一樣的對(duì)象的時(shí)候,下面的表達(dá)方式更靈巧:
// 推薦
result = object ? : [self createObject];
// 不推薦
result = object ? object : [self createObject];
錯(cuò)誤處理
有些方法通通過(guò)參數(shù)返回 error 的引用,使用這樣的方法時(shí)應(yīng)當(dāng)檢查方法的返回值,而非 error 的引用。
// 推薦
NSError *error = nil;
if (![self trySomethingWithError:&error]) {
// Handle Error
}
switch語(yǔ)句中的case,如果只有一行代碼可以不必加上大括號(hào),但是多行需要加上。
switch (condition) {
case 1:
// ...
break;
case 2: {
// ...
// Multi-line example using braces
break;
}
case 3:
// ...
break;
default:
// ...
break;
}
枚舉類型
使用NS_ENUM()這個(gè)宏來(lái)定義枚舉,它有更強(qiáng)大的的類型檢查和代碼補(bǔ)全。
typedef NS_ENUM(NSUInteger, ZOCMachineState) {
ZOCMachineStateNone,
ZOCMachineStateIdle,
ZOCMachineStateRunning,
ZOCMachineStatePaused
};
變量
盡量使用長(zhǎng)的、描述性的方法和變量名。
// 推薦
UIButton *settingsButton;
// 不推薦
UIButton *setBut;
常量應(yīng)該以駝峰法命名,并以相關(guān)類名作為前綴。
// 推薦
static const NSTimeInterval ZOCSignInViewControllerFadeOutAnimationDuration = 0.4;
// 不推薦
static const NSTimeInterval fadeOutTime = 0.4;
推薦使用常量來(lái)代替字符串字面值和數(shù)字。可以方便復(fù)用,快速修改。
常量應(yīng)該用static聲明為靜態(tài)常量,而不要用#define,除非它明確作為宏來(lái)使用。
// 推薦
static NSString * const ZOCCacheControllerDidClearCacheNotification = @"ZOCCacheControllerDidClearCacheNotification";
static const CGFloat ZOCImageThumbnailHeight = 50.0f;
// 不推薦
#define CompanyName @"Apple Inc."
#define magicNumber 42
常量如果需要暴露給外部,那么要在頭文件中以這樣的形式:
extern NSString *const ZOCCacheControllerDidClearCacheNotification;
并在實(shí)現(xiàn)文件中為它賦值。
只有公有的常量才需要添加命名空間作為前綴。盡管實(shí)現(xiàn)文件中私有常量的命名可以遵循另外一種模式,你仍舊可以遵循這個(gè)規(guī)則。
方法名與方法類型(-/+符號(hào))間應(yīng)加上一個(gè)空格。
方法段間也應(yīng)該以空格間隔。
參數(shù)前應(yīng)該有一個(gè)描述性的關(guān)鍵詞。
盡可能少用”and”這個(gè)詞,它不應(yīng)該用來(lái)闡明有多個(gè)參數(shù)。
// 推薦
- (void)setExampleText:(NSString *)text image:(UIImage *)image;
- (void)sendAction:(SEL)aSelector to:(id)anObject forAllCells:(BOOL)flag;
- (id)viewWithTag:(NSInteger)tag;
- (instancetype)initWithWidth:(CGFloat)width height:(CGFloat)height;
// 不推薦
- (void)setT:(NSString *)text i:(UIImage *)image;
- (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag;
- (id)taggedView:(NSInteger)tag;
- (instancetype)initWithWidth:(CGFloat)width andHeight:(CGFloat)height;
- (instancetype)initWith:(int)width and:(int)height; // Never do this.
使用字面值來(lái)創(chuàng)建不可變的NSString,NSDictionary,NSArray和NSNumber對(duì)象。
用這種方式,注意不要將nil放在NSArray和NSDictionary里,這樣會(huì)導(dǎo)致崩潰。
NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul"];
NSDictionary *productManagers = @{@"iPhone" : @"Kate", @"iPad" : @"Kamal", @"Mobile Web" : @"Bill"};
NSNumber *shouldUseLiterals = @YES;
NSNumber *buildingZIPCode = @10018;
不要這樣:
NSArray *names = [NSArray arrayWithObjects:@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul", nil];
NSDictionary *productManagers = [NSDictionary dictionaryWithObjectsAndKeys: @"Kate", @"iPhone", @"Kamal", @"iPad", @"Bill", @"Mobile Web", nil];
NSNumber *shouldUseLiterals = [NSNumber numberWithBool:YES];
NSNumber *buildingZIPCode = [NSNumber numberWithInteger:10018];
避免這樣的方式創(chuàng)建可變數(shù)組:
NSMutableArray *aMutableArray = [@[] mutableCopy];
這樣的方式,在效率和可讀性上都存在問(wèn)題。
效率:一個(gè)不必要的不可變數(shù)組被創(chuàng)建后馬上被廢棄,并沒(méi)有必要。
可讀性:可讀性并不好。
- 舉例講解Objective-C中@property屬性的用法
- 詳解Objective-C編程中對(duì)設(shè)計(jì)模式中適的配器模式的使用
- 詳解Objective-C設(shè)計(jì)模式編程中對(duì)備忘錄模式的運(yùn)用
- 淺析Objective-C中分類Category的使用
- Objective-C的NSOperation多線程類基本使用指南
- 簡(jiǎn)介Objective-C解析XML與JSON數(shù)據(jù)格式的方法
- 簡(jiǎn)單講解Objective-C的基本特性及其內(nèi)存管理方式
- 理解Objective-C的變量以及面相對(duì)象的繼承特性
- 以實(shí)例講解Objective-C中的KVO與KVC機(jī)制
- Objective-C中編程中一些推薦的書(shū)寫(xiě)規(guī)范小結(jié)
相關(guān)文章
iOS開(kāi)發(fā)中實(shí)現(xiàn)郵件和短信發(fā)送的簡(jiǎn)單示例
這篇文章主要介紹了iOS開(kāi)發(fā)中實(shí)現(xiàn)郵件和短信發(fā)送的簡(jiǎn)單示例,編程語(yǔ)言依然是傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-09-09
iOS開(kāi)發(fā)實(shí)現(xiàn)隨機(jī)圖片驗(yàn)證碼封裝
這篇文章主要介紹了iOS開(kāi)發(fā)實(shí)現(xiàn)隨機(jī)圖片驗(yàn)證碼封裝,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
IOS AFNetworking的Post失敗及requestSerializer的正確使用
這篇文章主要介紹了IOS AFNetworking的Post失敗及requestSerializer的正確使用的相關(guān)資料,需要的朋友可以參考下2017-05-05
IOS小組件實(shí)現(xiàn)時(shí)鐘按秒刷新功能
小組件運(yùn)行在單獨(dú)的進(jìn)程,如果異常會(huì)導(dǎo)致小組件進(jìn)程卡死了,一個(gè)小組件出問(wèn)題,其他小組件都不刷新了。既然刷新這么難控制,怎么實(shí)現(xiàn)數(shù)字時(shí)鐘按秒刷新呢?接下來(lái)通過(guò)代碼給大家介紹下ios小組件刷新功能的實(shí)現(xiàn),一起看看吧2021-05-05
詳解iOS使用Keychain中的kSecClassGenericPassword存儲(chǔ)數(shù)據(jù)
iOS設(shè)備中的Keychain是一個(gè)安全的存儲(chǔ)容器,本篇文章主要介紹了iOS使用Keychain中的kSecClassGenericPassword存儲(chǔ)數(shù)據(jù),有興趣的可以了解一下。2016-11-11
iOS 11更新后及iPhone X推出后工程中遇到的問(wèn)題及適配方法
這篇文章主要介紹了iOS 11更新后及iPhone X推出后工程中遇到的問(wèn)題及適配,需要的朋友可以參考下2017-10-10
ios啟動(dòng)頁(yè)強(qiáng)制豎屏(進(jìn)入App后允許橫屏與豎屏)
最近工作遇到這樣一個(gè)需要,當(dāng)進(jìn)入啟動(dòng)頁(yè)需要強(qiáng)制豎屏,而進(jìn)入APP后就允許橫屏與豎屏,通過(guò)查找相關(guān)的資料找到了解決的方法,所以將實(shí)現(xiàn)的方法整理后分享出來(lái),需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2017-03-03
基于UIControl控件實(shí)現(xiàn)ios點(diǎn)贊功能
在開(kāi)發(fā)當(dāng)中,可能很多時(shí)候都需要做個(gè)點(diǎn)贊的需求,如果用按鈕實(shí)現(xiàn),按鈕作為一個(gè)系統(tǒng)復(fù)合控件,外部是一個(gè) View--》UIControl的容器,本文給大家分享一個(gè)基于UIControl控件實(shí)現(xiàn)ios點(diǎn)贊功能,需要的朋友可以參考下2015-09-09

