iOS代碼規(guī)范

iOS代碼規(guī)范

代碼規(guī)范
    遵循原則:見文知意、清晰簡潔、無錯(cuò)。
包括:
命名規(guī)范
代碼規(guī)范
注釋規(guī)范
項(xiàng)目規(guī)范

1、命名規(guī)范

類名首字母大寫,方法首字母小寫,方法中的參數(shù)首字母小寫,同時(shí)盡量讓方法的命名讀起來像一句話,能夠傳達(dá)出方法的意。
原則:見文知意。

1)類名命名

采用大駝峰法則,即每個(gè)單詞的首字母采用大寫字母。
格式:前綴+名字+類型
前綴:大寫,例如GG,用于修飾
類型:用于表明類的范圍的,繼承NSObject的類可不寫

例如:
GGDemoView:前綴:GG,名字:Demo,類型:View
2)變量命名

采用小駝峰法則,第一個(gè)單詞的首字母小寫,后面單詞的首字母全部大寫。

例如:name,passWord。
3)常量命名

采用大駝峰法則,前綴加小k。

例如:NSString *kPersonName = @”abc”;
4)宏命名

采用大駝峰法則。

例如:#define AppKey  @"1235"
5)方法命名

采用小駝峰法則,第一個(gè)單詞的首字母小寫,后面單詞的首字母全部大寫。同時(shí),盡量讓方法名讀起來像是一句話,能夠清晰的傳達(dá)方法要表達(dá)的意思。
例如:

- (instancetype)initWithFrame:(CGRect)frame;
  • 取得某個(gè)對(duì)象,以名詞作為方法的開頭;
例如:
    - (UIImage *)imageName:(NSString *)name;
  • 表示執(zhí)行某操作,以動(dòng)詞作為方法的開頭,get、make、set等;
例如:
    - (void)setupData;
  • 如果方法有參數(shù),每個(gè)參數(shù)前最好有參數(shù)提示;
例如:
    - (instancetype)init:(CGRect)frame; //糟糕的方法命名
    - (instancetype)initWithFrame:(CGRect)frame; //好的方法命名
  • 如果方法有多個(gè)參數(shù),不需要用and連接;
例如:
    - (instancetype)initWithFrame:(CGRect)frame andTitle:(NSString *)title; //不是很好
    - (instancetype)initWithFrame:(CGRect)frame title:(NSString *)title; //好
  • 返回BOOL值在方法前加前綴ishas
例如:
    - (BOOL)isEqualToString:(NSString *)aString;

2、代碼規(guī)范

原則:有條理,層次清晰

1)屬性、變量的聲明
  • 屬性、變量聲明
    屬性聲明格式:@property(nonatomic, 關(guān)鍵字) + 1空格 + 類型 + 1空格 + *名稱;
    例如:
@property(nonatomic, strong) NSString *name;

特點(diǎn):類型跟星號(hào)之間有一個(gè)空格,星號(hào)緊跟變量名稱,括號(hào)內(nèi)的參數(shù)列表,逗號(hào)緊跟前一個(gè)參數(shù)再空格接下一個(gè)參數(shù)。
注意:此格式適用于繼承自NSObject類的類型,對(duì)于基本數(shù)據(jù)類型的屬性/變量只是沒有“*”的區(qū)別。

  • 屬性的使用
    請(qǐng)使用self.的方式應(yīng)用類的成員變量,不推薦使用_變量名的方式。
    例如:
    推薦使用self.的方式:
        self.tableView.delegate = self;
        self.tableView.dataSource = self;
        
    不推薦如下的方式:
        _tableView.delegate = self;
        _tableView.dataSource = self;
2)方法
  • 方法聲明的規(guī)范
    格式:-/+ + 空格 (類型)方法名;
    特點(diǎn):-/+與返回類型之間有個(gè)空格,參數(shù)的類型用括號(hào)括起,參數(shù)之間有一個(gè)空格。
例如:
  - (instancetype)initWithFrame:(CGRect)frame;
  - (instancetype)initWithFrame:(CGRect)frame type:(int)type;
  • 方法實(shí)現(xiàn)
    特點(diǎn):除上面的2)方法聲明的規(guī)范外,
    1)在方法的結(jié)尾處加一個(gè)空格,然后緊跟大括號(hào)“{”;
    2)方法與方法之間空一行。
例如:
  - (instancetype)initWithFrame:(CGRect)frame type:(int)type {
    
  }
  //方法與方法之間空一行
  - (void)viewDidLoad {
    [super viewDidLoad];
  }
3)變量與方法聲明的位置

對(duì)于私有變量、私有方法的聲明,請(qǐng)把它們放在.m文件中。區(qū)別是不是私有,原則就是這個(gè)變量或方法要不要在別的地方使用,若是不要,就不要在.h文件中聲明了,在.h文件中聲明的就是公開。

4)操作符前后用1個(gè)空格隔開。

例如:

推薦寫法:
    NSString *str = @"123456";
    NSInteger num = 2;
    BOOL flage = num > 1;
    str = flage ? @"1" : @"0";
這樣寫程序沒有對(duì)與錯(cuò),只是給人感覺有點(diǎn)凌亂:
    NSString*str =@"123456";
    NSInteger num=2;
    BOOL flage=num>1;
    str = flage?@"1":@"0";
5)代碼縮進(jìn)

1)使用xcode默認(rèn)縮進(jìn),即tab = 4space,快捷鍵:左縮進(jìn)commend+[,右縮進(jìn)commend+]
2)xcode也提供格式化功能,選中代碼,快捷鍵:control+i

6)判斷nilYES/NO

推薦寫法:

if (someObject) { ... }
if (!someObject) { ... }

避免如下寫:

if (someObject == YES) { ...}
if (someObject != nil) { ...}

理由:if (someObject == YES)容易誤寫成賦值語句, if (someObject)寫法也很簡潔。

7)可變類型的變量要初始化

對(duì)于mutale類型的成員變量,如NSMutableArrayNSMutableDicyionary,先要完成初始化,再使用,沒有初始化的話這個(gè)變量是為nil的。

8)block

使用block塊,要弱引用對(duì)象,避免循環(huán)引用。使用關(guān)鍵字__weak__block__block可以修飾對(duì)象也可修飾基礎(chǔ)數(shù)據(jù)類型的變量,__weak只能修飾對(duì)象。
規(guī)范寫法如下:

__weak typeof(self) weakSelf = self;
myObj.myBlock =  ^{
    __strong typeof(self) strongSelf = weakSelf;
    if (strongSelf) {
        [strongSelf doSomething]; // strongSelf != nil
        // preemption, strongSelf still not nil
        [strongSelf doSomethingElse]; // strongSelf != nil
    }       
    else {
        // Probably nothing...
        return;
    }
};
9)移除通知

注冊(cè)了observer,記得移除它,不限移除時(shí)間,但要保證在對(duì)象銷毀前移除它,建議在dealloc方法中將observer移除。

10)避免硬編碼

死值每次修改的時(shí)候容易被遺忘,也不方便查找、修改,另外僅僅看到一個(gè)數(shù)字,完全不知道這個(gè)數(shù)字代表的意義。可以采用動(dòng)態(tài)獲取,定義枚舉、定義常量(知道含義)的方式。
例如:

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 2; //應(yīng)盡量避免使用具體的數(shù)值,除非是很明確的情況下
}   

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return self.array.count; //這種方式比寫具體值方便多了。
}   
11)對(duì)象判空(nil)處理

對(duì)于外部傳過的參數(shù)(特指對(duì)象)建議先進(jìn)行空判斷,避免不必要的錯(cuò)誤,尤其是跟網(wǎng)絡(luò)相關(guān)的數(shù)據(jù)(有可能json解析出來為空)。
提示:NSArray、NSDictionary類型的對(duì)象是不能添加nil數(shù)據(jù)的。

3、注釋規(guī)范

注釋方法有單行多行注釋,按需求選擇。單行注釋的快捷鍵:commend+/。

1)變量注釋
2)方法注釋

方法定義必須注釋清楚用途、入?yún)⒊鰠⒑x、要求,建議使用VVdocumenter插件;
備注:xcode 8以后,會(huì)發(fā)現(xiàn)常用的注釋插件VVdocumenter無法使用了。其實(shí)它是被Apple采納了,融合到了xcode中了。快捷鍵:option+commend+/。(注意:光標(biāo)要位于具體的方法處才有效)

3)類描述

類名最好能描述清楚自身是干什么用的,在頭文件的注釋中增加一行描述;

4)pragma mark

代碼要按功能模塊分塊,用#pragma mark – name進(jìn)行分組;

4、項(xiàng)目規(guī)范

1)項(xiàng)目的目錄結(jié)構(gòu)

一個(gè)合理的目錄結(jié)構(gòu)首先應(yīng)該是清晰的,讓人一眼看上去就能大概了解目錄的職責(zé),且容易應(yīng)對(duì)新的變化。
在我們的項(xiàng)目中主目錄按照模塊分類,內(nèi)目錄按業(yè)務(wù)分類的方式。我們?cè)趚code看到了目錄結(jié)構(gòu),也要保證文件在磁盤中的存儲(chǔ)結(jié)構(gòu)也是如此的,方便查找、也方便管理。例如,在xcode創(chuàng)建了一個(gè)model目錄,當(dāng)向model目錄中添加文件時(shí),確保文件的存儲(chǔ)位置是在model這個(gè)文件夾下。

2) 項(xiàng)目文件命名規(guī)范

采用大駝峰法則。但是不限使用中文標(biāo)注,中文標(biāo)注建議用小括號(hào)括起來。

例如:Tools(工具)
3)操作上的建議

1)按照目錄層次來放置文件,建立子目錄。

--養(yǎng)成一個(gè)良好的編程習(xí)慣 --

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容