国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > iOS > 正文

Objective-C編程中語(yǔ)句和變量的一些編寫(xiě)規(guī)范建議

2019-10-21 18:55:06
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
這篇文章主要介紹了Objective-C編程中語(yǔ)句和變量的一些編寫(xiě)規(guī)范建議,包括三目運(yùn)算符和錯(cuò)誤處理等方面,以及對(duì)變量命名的書(shū)寫(xiě)建議,需要的朋友可以參考下
 

語(yǔ)句
條件語(yǔ)句

條件語(yǔ)句體應(yīng)該總被大括號(hào)包圍。只有一行代碼最好也加上,否則會(huì)帶來(lái)安全隱患。

復(fù)制代碼代碼如下:

// 推薦
if (!error) {
    return success;
}

 

// 不推薦
if (!error)
    return success;

if (!error) return success;


尤達(dá)表達(dá)式(Yoda)

 

不要使用尤達(dá)表達(dá)式。(名字起源于星球大戰(zhàn)中尤達(dá)大師的講話方式,總是用倒裝的語(yǔ)序)

復(fù)制代碼代碼如下:

// 推薦
if ([myValue isEqual:@42]) { ...

 

// 不推薦
if ([@42 isEqual:myValue]) { ...


nil和BOOL的檢查

 

一些人喜歡用這樣的方式來(lái)檢查nil:

復(fù)制代碼代碼如下:

if (nil == myValue) { ...

這樣做可以避開(kāi)少些一個(gè)"=“的錯(cuò)誤,因?yàn)橐坏┥賹?xiě)一個(gè)”=“,那么nil是不能被賦值的,編譯器會(huì)報(bào)錯(cuò)。

 

但是前面提到,最好不要使用尤達(dá)表達(dá)式。所以更好的解決方法是用”!”來(lái)完成nil和BOOL的檢查。

復(fù)制代碼代碼如下:

// 推薦
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中。

復(fù)制代碼代碼如下:

// 推薦
- (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變量。

復(fù)制代碼代碼如下:

BOOL nameContainsSwift  = [sessionName containsString:@"Swift"];
BOOL isCurrentYear      = [sessionDateCompontents year] == 2014;
BOOL isSwiftSession     = nameContainsSwift && isCurrentYear;

 

if (isSwiftSession) {
    // Do something very cool
}


三元運(yùn)算符

 

三元運(yùn)算符要保證可讀性。

復(fù)制代碼代碼如下:

// 推薦
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á)方式更靈巧:
復(fù)制代碼代碼如下:

// 推薦
result = object ? : [self createObject];

 

// 不推薦
result = object ? object : [self createObject];


錯(cuò)誤處理

 

有些方法通通過(guò)參數(shù)返回 error 的引用,使用這樣的方法時(shí)應(yīng)當(dāng)檢查方法的返回值,而非 error 的引用。

復(fù)制代碼代碼如下:

// 推薦
NSError *error = nil;
if (![self trySomethingWithError:&error]) {
    // Handle Error
}

switch語(yǔ)句中的case,如果只有一行代碼可以不必加上大括號(hào),但是多行需要加上。
復(fù)制代碼代碼如下:

switch (condition) {
    case 1:
        // ...
        break;
    case 2: {
        // ...
        // Multi-line example using braces
        break;
       }
    case 3:
        // ...
        break;
    default: 
        // ...
        break;
}

枚舉類(lèi)型

 

使用NS_ENUM()這個(gè)宏來(lái)定義枚舉,它有更強(qiáng)大的的類(lèi)型檢查和代碼補(bǔ)全。

復(fù)制代碼代碼如下:

typedef NS_ENUM(NSUInteger, ZOCMachineState) {
    ZOCMachineStateNone,
    ZOCMachineStateIdle,
    ZOCMachineStateRunning,
    ZOCMachineStatePaused
};

 

變量
盡量使用長(zhǎng)的、描述性的方法和變量名。

復(fù)制代碼代碼如下:

// 推薦
UIButton *settingsButton;

 

// 不推薦
UIButton *setBut;


常量應(yīng)該以駝峰法命名,并以相關(guān)類(lèi)名作為前綴。
復(fù)制代碼代碼如下:

// 推薦
static const NSTimeInterval ZOCSignInViewControllerFadeOutAnimationDuration = 0.4;

 

// 不推薦
static const NSTimeInterval fadeOutTime = 0.4;


推薦使用常量來(lái)代替字符串字面值和數(shù)字。可以方便復(fù)用,快速修改。

 

常量應(yīng)該用static聲明為靜態(tài)常量,而不要用#define,除非它明確作為宏來(lái)使用。

復(fù)制代碼代碼如下:

// 推薦
static NSString * const ZOCCacheControllerDidClearCacheNotification = @"ZOCCacheControllerDidClearCacheNotification";

 

static const CGFloat ZOCImageThumbnailHeight = 50.0f;

// 不推薦
#define CompanyName @"Apple Inc."
#define magicNumber 42


常量如果需要暴露給外部,那么要在頭文件中以這樣的形式:
復(fù)制代碼代碼如下:

extern NSString *const ZOCCacheControllerDidClearCacheNotification;

并在實(shí)現(xiàn)文件中為它賦值。

 

只有公有的常量才需要添加命名空間作為前綴。盡管實(shí)現(xiàn)文件中私有常量的命名可以遵循另外一種模式,你仍舊可以遵循這個(gè)規(guī)則。

方法名與方法類(lèi)型(-/+符號(hào))間應(yīng)加上一個(gè)空格。

方法段間也應(yīng)該以空格間隔。

參數(shù)前應(yīng)該有一個(gè)描述性的關(guān)鍵詞。

盡可能少用”and”這個(gè)詞,它不應(yīng)該用來(lái)闡明有多個(gè)參數(shù)。

復(fù)制代碼代碼如下:

// 推薦
- (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)致崩潰。

復(fù)制代碼代碼如下:

NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul"];
NSDictionary *productManagers = @{@"iPhone" : @"Kate", @"iPad" : @"Kamal", @"Mobile Web" : @"Bill"};
NSNumber *shouldUseLiterals = @YES;
NSNumber *buildingZIPCode = @10018;

不要這樣:
復(fù)制代碼代碼如下:

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ù)組:
復(fù)制代碼代碼如下:

NSMutableArray *aMutableArray = [@[] mutableCopy];

這樣的方式,在效率和可讀性上都存在問(wèn)題。

 

效率:一個(gè)不必要的不可變數(shù)組被創(chuàng)建后馬上被廢棄,并沒(méi)有必要。

可讀性:可讀性并不好。



注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到IOS開(kāi)發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 墨脱县| 曲水县| 五华县| 菏泽市| 民勤县| 长泰县| 孝义市| 绿春县| 太仓市| 县级市| 集安市| 神农架林区| 上思县| 石楼县| 安平县| 清水县| 福鼎市| 吉安县| 六安市| 哈巴河县| 土默特左旗| 杭锦后旗| 龙门县| 孟村| 武冈市| 莎车县| 玉环县| 龙川县| 呈贡县| 焉耆| 陵水| 江山市| 滦南县| 南康市| 孝义市| 大埔县| 富宁县| 苗栗县| 昆山市| 竹山县| 华宁县|