iOS 代碼規(guī)范(自個(gè)公司)

iOS Objective-C Code Style

前言 : 為了使代碼清晰簡(jiǎn)潔,方便閱讀理解,都會(huì)統(tǒng)一遵從一定的代碼規(guī)范 .
本期使用MVC框架 , 保持公共API 的簡(jiǎn)潔性 .

一、命名

1.每行的長(zhǎng)度

每行的長(zhǎng)度不得超過 120 個(gè)字符
設(shè)置: “Xcode => Preferences => TextEditing => 勾選 Show Page Guide / 輸入100 => OK”


2.關(guān)于命名

統(tǒng)一要求 : 含義清楚,盡量做到不需要注釋也能了解其作用,若做不到,就加注釋 .
          按照駝峰式命名法則:(大駝峰:每個(gè)單詞首字母都大寫--小駝峰:第一個(gè)單子首字母小寫,其余都大寫)
         類名首字母大寫,方法首字母小寫,方法中的參數(shù)首字母小寫,長(zhǎng)度無限制.
         盡量方法名讀起來一句話
         變量名的大小在2-20個(gè)字母之間,避免單字母變量.


1>property變量


@property (nonatomic, strong) NSMutableArray *駝峰命名規(guī)則:
                                                指針*要靠近變量名
                                                前部分參數(shù)用途: path 
                                                后部分參數(shù)類型: muArr
                                                最后: 注釋(若后期維護(hù)新添加或刪除的變量-加自個(gè)名字)
@property (nonatomic, strong) NSMutableArray *pathMuArr;//可變數(shù)組用來儲(chǔ)存路徑- LYG 

縮寫規(guī)則:
        (如:表)

字符串
NSString
str
可變字符串
NSMutableString
muStr
字典
NSDictionary
dic
可變字典
NSMutableDictionary
muDic
數(shù)組
NSArray
arr
可變數(shù)組
NSMutableArray
muArr
數(shù)據(jù)
NSData
data
可變數(shù)組
NSMutableData
muData
標(biāo)簽
UILabel
label
按鈕
UIButton
btn
圖片
UIImage
img
圖片視圖
UIImageView
imgV
bool 值
BOOL
is…

UINavigationController
nav

backgroundColor
bg

UITableViewCell
cell

UIViewController
viewController

UIView
view

2>宏 Define

?   全部大寫,單詞用_進(jìn)行分割(不帶參數(shù))
    #define THIS_IS_AN_MACRO @"THIS_IS_AN_MACRO"

?   以字母 k 開頭,后面要遵循大駝峰命名規(guī)則(不帶參數(shù))
    #define kDefaultLineWidth 8
   #define kWidth self.frame.size.width

?   小駝峰命名(帶參數(shù))
 #define getImageUrl(url) [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",kBaseUrl,url]]


3>枚舉 Eeum

?   枚舉命名和類的命名一樣
?   枚舉中的內(nèi)容命名需要以改枚舉類型名稱開頭

    typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
     AFNetworkReachabilityStatusUnknown = -1,
     AFNetworkReachabilityStatusNotReachable = 0,
     AFNetworkReachabilityStatusReachableViaWWAN = 1,
     AFNetworkReachabilityStatusReachableViaWiFi = 2
    };

    typedef NS_ENUM(NSInteger ,DrawStyle){
        DrawStyleFreedomLine = 100,
        DrawStyleLine = 1,
        DrawStyleCircle = 2,
        DrawStyleRectangle = 3,
        DrawStyleOval = 4,
        DrawStyleTriangle = 5,
        DrawStyleCurve = 6,
        DrawStyleRubber = 7
    };      


4>代理 Delegate

    Protocol : 使用 delegate 作為后綴

?   類的實(shí)例必須為回調(diào)方法的參數(shù)之一(numberOfRowsInSection中的section)
    -(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section


?   回調(diào)方法的參數(shù)只有類自己的情況,方法名要符合實(shí)際含義(numberOfSectionsInTableView)
      -(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView


?   以類的名字開頭(回調(diào)方法存在兩個(gè)以上參數(shù)的情況)以表明此方法是屬于哪個(gè)類的(tableView)
    -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


類型標(biāo)示符、代理名稱、尖括號(hào)間不留空格
該規(guī)則同樣適用于:類聲明、實(shí)例變量和方法聲明 
 每一個(gè)delegate都把對(duì)應(yīng)的protocol名字帶上,delegate方法不要亂寫,寫到一塊區(qū)域里面去

@interface MyProtocoledClass : NSObject<NSWindowDelegate> {
@private
id<MyFancyDelegate> _delegate;
}

  • (void)setDelegate:(id<MyFancyDelegate>)aDelegate;@end
    如果類聲明中包含多個(gè)protocal,每個(gè)protocal占用一行,縮進(jìn)4個(gè)字符。
    如:
    @interface CustomViewController : ViewController<
    AbcDelegate,
    DefDelegate

{
... }

5>block

使用Block時(shí),內(nèi)容四個(gè)空格縮進(jìn),“^”后帶有參數(shù)時(shí),參數(shù)與“{”之間有一個(gè)空格縮進(jìn)
@property (nonatomic ,copy) void (^colorBlock)(UIColor *);




6>方法的聲明和定義

?   在 - OR + 和返回值之間留 1 個(gè)空格,方法名和第一個(gè)參數(shù)間不留空格 
- (void)doSomethingWithString:(NSString *)theString 
    {
      ...
      }
  ? 當(dāng)參數(shù)過長(zhǎng)時(shí),每個(gè)參數(shù)占用一行,以冒號(hào)對(duì)齊
     - (void)doSomethingWith:(GTMFoo *)theFoo
                        rect:(NSRect)theRect
                    interval:(float)theInterval
        {
        ...
        }

  ? 如果方法名比參數(shù)名短,每個(gè)參數(shù)占用一行,至少縮進(jìn)4個(gè)字符,且為垂直對(duì)齊
    - (void)writeA:(NSString *)firstStr
            withBBBBBBBBBBB:(NSString *)nextStr
            withCCCCCC:(NSString *)lastStr
    {
      ...  
    }


  ? Method與Method之間空一行(官方規(guī)定左括號(hào)應(yīng)另起一行)
    - (void)samplePrivateMethod
    {
        ...
    }

    - (void)sampleForIf
    {
        ...
    }




7>使用#pragma Mark - 標(biāo)注一類函數(shù),便于查找

iOS Objective-C Code Style

前言 : 為了使代碼清晰簡(jiǎn)潔,方便閱讀理解,都會(huì)統(tǒng)一遵從一定的代碼規(guī)范 .
本期使用MVC框架 , 保持公共API 的簡(jiǎn)潔性 .

一、命名

1.每行的長(zhǎng)度

每行的長(zhǎng)度不得超過 120 個(gè)字符
設(shè)置: “Xcode => Preferences => TextEditing => 勾選 Show Page Guide / 輸入100 => OK”


2.關(guān)于命名

統(tǒng)一要求 : 含義清楚,盡量做到不需要注釋也能了解其作用,若做不到,就加注釋 .
          按照駝峰式命名法則:(大駝峰:每個(gè)單詞首字母都大寫--小駝峰:第一個(gè)單子首字母小寫,其余都大寫)
         類名首字母大寫,方法首字母小寫,方法中的參數(shù)首字母小寫,長(zhǎng)度無限制.
         盡量方法名讀起來一句話
         變量名的大小在2-20個(gè)字母之間,避免單字母變量.


1>property變量


@property (nonatomic, strong) NSMutableArray *駝峰命名規(guī)則:
                                                指針*要靠近變量名
                                                前部分參數(shù)用途: path 
                                                后部分參數(shù)類型: muArr
                                                最后: 注釋(若后期維護(hù)新添加或刪除的變量-加自個(gè)名字)
@property (nonatomic, strong) NSMutableArray *pathMuArr;//可變數(shù)組用來儲(chǔ)存路徑- LYG 

縮寫規(guī)則:
        (如:表)

字符串
NSString
str
可變字符串
NSMutableString
muStr
字典
NSDictionary
dic
可變字典
NSMutableDictionary
muDic
數(shù)組
NSArray
arr
可變數(shù)組
NSMutableArray
muArr
數(shù)據(jù)
NSData
data
可變數(shù)組
NSMutableData
muData
標(biāo)簽
UILabel
label
按鈕
UIButton
btn
圖片
UIImage
img
圖片視圖
UIImageView
imgV
bool 值
BOOL
is…

UINavigationController
nav

backgroundColor
bg

UITableViewCell
cell

UIViewController
viewController

UIView
view

2>宏 Define

?   全部大寫,單詞用_進(jìn)行分割(不帶參數(shù))
    #define THIS_IS_AN_MACRO @"THIS_IS_AN_MACRO"

?   以字母 k 開頭,后面要遵循大駝峰命名規(guī)則(不帶參數(shù))
    #define kDefaultLineWidth 8
   #define kWidth self.frame.size.width

?   小駝峰命名(帶參數(shù))
 #define getImageUrl(url) [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",kBaseUrl,url]]


3>枚舉 Eeum

?   枚舉命名和類的命名一樣
?   枚舉中的內(nèi)容命名需要以改枚舉類型名稱開頭

    typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
     AFNetworkReachabilityStatusUnknown = -1,
     AFNetworkReachabilityStatusNotReachable = 0,
     AFNetworkReachabilityStatusReachableViaWWAN = 1,
     AFNetworkReachabilityStatusReachableViaWiFi = 2
    };

    typedef NS_ENUM(NSInteger ,DrawStyle){
        DrawStyleFreedomLine = 100,
        DrawStyleLine = 1,
        DrawStyleCircle = 2,
        DrawStyleRectangle = 3,
        DrawStyleOval = 4,
        DrawStyleTriangle = 5,
        DrawStyleCurve = 6,
        DrawStyleRubber = 7
    };      


4>代理 Delegate

    Protocol : 使用 delegate 作為后綴

?   類的實(shí)例必須為回調(diào)方法的參數(shù)之一(numberOfRowsInSection中的section)
    -(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section


?   回調(diào)方法的參數(shù)只有類自己的情況,方法名要符合實(shí)際含義(numberOfSectionsInTableView)
      -(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView


?   以類的名字開頭(回調(diào)方法存在兩個(gè)以上參數(shù)的情況)以表明此方法是屬于哪個(gè)類的(tableView)
    -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


類型標(biāo)示符、代理名稱、尖括號(hào)間不留空格
該規(guī)則同樣適用于:類聲明、實(shí)例變量和方法聲明每一個(gè)delegate都把對(duì)應(yīng)的protocol名字帶上,delegate方法不要亂寫,寫到一塊區(qū)域里面去
@interface MyProtocoledClass : NSObject<NSWindowDelegate> {
@private
 id<MyFancyDelegate> _delegate;
 }
- (void)setDelegate:(id<MyFancyDelegate>)aDelegate;@end
如果類聲明中包含多個(gè)protocal,每個(gè)protocal占用一行,縮進(jìn)4個(gè)字符。 
如: 
 @interface CustomViewController : ViewController<
   AbcDelegate,
   DefDelegate
{ 
... } 

5>block

使用Block時(shí),內(nèi)容四個(gè)空格縮進(jìn),“^”后帶有參數(shù)時(shí),參數(shù)與“{”之間有一個(gè)空格縮進(jìn)
@property (nonatomic ,copy) void (^colorBlock)(UIColor *);




6>方法的聲明和定義

?   在 - OR + 和返回值之間留 1 個(gè)空格,方法名和第一個(gè)參數(shù)間不留空格 
- (void)doSomethingWithString:(NSString *)theString 
    {
      ...
      }
  ? 當(dāng)參數(shù)過長(zhǎng)時(shí),每個(gè)參數(shù)占用一行,以冒號(hào)對(duì)齊
     - (void)doSomethingWith:(GTMFoo *)theFoo
                        rect:(NSRect)theRect
                    interval:(float)theInterval
        {
        ...
        }

  ? 如果方法名比參數(shù)名短,每個(gè)參數(shù)占用一行,至少縮進(jìn)4個(gè)字符,且為垂直對(duì)齊
    - (void)writeA:(NSString *)firstStr
            withBBBBBBBBBBB:(NSString *)nextStr
            withCCCCCC:(NSString *)lastStr
    {
      ...  
    }


  ? Method與Method之間空一行(官方規(guī)定左括號(hào)應(yīng)另起一行)
    - (void)samplePrivateMethod
    {
        ...
    }

    - (void)sampleForIf
    {
        ...
    }




7>使用#pragma Mark - 標(biāo)注一類函數(shù),便于查找


    8>注釋問題

?   .h和.m 文件注釋:

/* 登陸頁面主頁 ***********************************************************************************************************

  • 類名* 建立日期* 版權(quán)聲明作者模塊描述----------------------------------------------------------------* 修改歷史* 序號(hào) 日期 修改人 修改原因12 **********************************************************************************************************
    */
?   類和對(duì)象方法注釋:

1 /**
2   * @brief 登錄驗(yàn)證
3   *
4   * @param personId 用戶名
5   * @param password 密碼
6   * @param complete 執(zhí)行完畢的block
7   *
8   * @return
9   */
10   + (void)loginWithPersonId:(NSString *)personId password:(NSString *)password complete:(void (^)(CheckLogon *result))complete;

?   聲明注釋

@property (nonatomic, strong) Student *student; //進(jìn)行單行注釋
采用//進(jìn)行單行注釋。所有邏輯判斷需要添加注釋說明。所有變量、常量需要添加注釋說明

對(duì) nil 的檢查
? 僅在有業(yè)務(wù)邏輯需求時(shí)檢查 nil,而非為了防止崩潰? 向 nil 發(fā)送消息不會(huì)導(dǎo)致系統(tǒng)崩潰,Objective-C 運(yùn)行時(shí)負(fù)責(zé)處理

對(duì) BOOL 陷阱
? 禁止將int直接轉(zhuǎn)換(cast or convert)為BOOL 。Objective-C中,BOOL 被定義為 unsigned char,這意味著除了 YES (1) 和 NO (0)外它還可以是其他 值。? 將整型值轉(zhuǎn)換為 BOOL 的方法:使用三元運(yùn)算符返回 YES / NO,或使用位運(yùn)算符 (&&, ||, !)。
? 禁止將數(shù)組的大小、指針值或位運(yùn)算符的結(jié)果轉(zhuǎn)換(cast or convert)為 BOOL,因?yàn)樵?BOOL 值的結(jié)果取決于整型值的最后一位。? 在Objective-C中,只允許使用BOOL? 如:
// 禁止- (BOOL)isBold {
return [self fontTraits] & NSFontBoldTrait;
}
- (BOOL)isValid {
return [self stringValue];
}
// 推薦- (BOOL)isBold {
return ([self fontTraits] & NSFontBoldTrait) ? YES : NO;
}
- (BOOL)isValid {
return [self stringValue] != nil;
}
- (BOOL)isEnabled {
return [self isValid] && [self isBold];
}
? 禁止直接將 BOOL 和 YES/NO 比較,如:
// 禁止
BOOL great = [foo isGreat]; if (great == YES)...// 推薦
BOOL great = [foo isGreat];
if (great)
...

 常用的快捷方式
    command+r 運(yùn)行
    command+. 停止 死循環(huán)中用到
    command+b 編譯 編譯程序不運(yùn)行
    command+z 回退
    command+shift+z 前進(jìn)
    command+a 全選
    command+c v x  復(fù)制 粘貼 剪貼
    command+tab 不同程序之間的切換
    command+ ~ 相同程序之間切換
    command+q 退出
    command + shift + J 快速定位當(dāng)前所在文件位置

更多快捷鍵: http://www.cocoachina.com/ios/20160822/17393.html

iOS團(tuán)隊(duì)要求

1 刪除多余的空行 * 所有方法與方法之間空1行 * 所有代碼塊之間空1行
2 刪除多余的注釋 * 刪除注釋掉的代碼 * 刪除沒有意義的注釋
3 刪除多余的方法 * 如果方法沒有使用到,請(qǐng)刪除它 * 如果方法沒有執(zhí)行任何業(yè)務(wù)邏輯,請(qǐng)刪除它或者給出一定注釋
4 刪除未被使用的資源文件
5 添加必要的注釋 * 所有 .h 文件中的property 需要給出注釋 * 所有自定義的方法需要給出注釋 * 比較大的代碼塊需要給出注釋 * 所有代碼中出現(xiàn)的阿拉伯?dāng)?shù)字需要給出注釋 * 程序中出現(xiàn)加密/解密 邏輯的操作地方,需要給出注釋說明過程(無論是系統(tǒng)還是自定義)
6 整體代碼風(fēng)格需要統(tǒng)一 * 代碼后面的”{“ 不需要單獨(dú)占用一行 * 邏輯運(yùn)算符 與 代碼之間空一格 * “#pragma mark -” 與下面的代碼之前不要空行 * 遵循一般性的代碼規(guī)范

寫代碼規(guī)范35條小建議: http://www.itdecent.cn/p/71fdd1ae714c

    8>注釋問題

?   .h和.m 文件注釋:

/* 登陸頁面主頁 ***********************************************************************************************************

  • 類名* 建立日期* 版權(quán)聲明作者模塊描述----------------------------------------------------------------* 修改歷史* 序號(hào) 日期 修改人 修改原因12 **********************************************************************************************************
    */
?   類和對(duì)象方法注釋:

1 /**
2   * @brief 登錄驗(yàn)證
3   *
4   * @param personId 用戶名
5   * @param password 密碼
6   * @param complete 執(zhí)行完畢的block
7   *
8   * @return
9   */
10   + (void)loginWithPersonId:(NSString *)personId password:(NSString *)password complete:(void (^)(CheckLogon *result))complete;

    ?   聲明注釋
`
@property (nonatomic, strong) Student *student; //進(jìn)行單行注釋`
采用//進(jìn)行單行注釋。所有邏輯判斷需要添加注釋說明。所有變量、常量需要添加注釋說明


對(duì) nil 的檢查 
? 僅在有業(yè)務(wù)邏輯需求時(shí)檢查 nil,而非為了防止崩潰? 向 nil 發(fā)送消息不會(huì)導(dǎo)致系統(tǒng)崩潰,Objective-C 運(yùn)行時(shí)負(fù)責(zé)處理 


對(duì) BOOL 陷阱 
? 禁止將int直接轉(zhuǎn)換(cast or convert)為BOOL 。Objective-C中,BOOL 被定義為 unsigned char,這意味著除了 YES (1) 和 NO (0)外它還可以是其他 值。? 將整型值轉(zhuǎn)換為 BOOL 的方法:使用三元運(yùn)算符返回 YES / NO,或使用位運(yùn)算符 (&&, ||, !)。 
? 禁止將數(shù)組的大小、指針值或位運(yùn)算符的結(jié)果轉(zhuǎn)換(cast or convert)為 BOOL,因?yàn)樵?BOOL 值的結(jié)果取決于整型值的最后一位。? 在Objective-C中,只允許使用BOOL? 如: 

// 禁止- (BOOL)isBold {
return [self fontTraits] & NSFontBoldTrait;
}
- (BOOL)isValid {
return [self stringValue];
}
// 推薦- (BOOL)isBold {
return ([self fontTraits] & NSFontBoldTrait) ? YES : NO;
}
- (BOOL)isValid {
return [self stringValue] != nil;
}
- (BOOL)isEnabled {
return [self isValid] && [self isBold];
}
? 禁止直接將 BOOL 和 YES/NO 比較,如:
// 禁止
BOOL great = [foo isGreat]; if (great == YES)...// 推薦
BOOL great = [foo isGreat];
if (great)
...




     常用的快捷方式
        command+r 運(yùn)行
        command+. 停止 死循環(huán)中用到
        command+b 編譯 編譯程序不運(yùn)行
        command+z 回退
        command+shift+z 前進(jìn)
        command+a 全選
        command+c v x  復(fù)制 粘貼 剪貼
        command+tab 不同程序之間的切換
        command+ ~ 相同程序之間切換
        command+q 退出
        command + shift + J 快速定位當(dāng)前所在文件位置

[更多快捷鍵](http://www.cocoachina.com/ios/20160822/17393.htm)



----


iOS團(tuán)隊(duì)要求

1 刪除多余的空行     * 所有方法與方法之間空1行     * 所有代碼塊之間空1行
2 刪除多余的注釋    * 刪除注釋掉的代碼     * 刪除沒有意義的注釋
3 刪除多余的方法     * 如果方法沒有使用到,請(qǐng)刪除它     * 如果方法沒有執(zhí)行任何業(yè)務(wù)邏輯,請(qǐng)刪除它或者給出一定注釋
4 刪除未被使用的資源文件
5 添加必要的注釋     * 所有 .h 文件中的property 需要給出注釋     * 所有自定義的方法需要給出注釋     * 比較大的代碼塊需要給出注釋     * 所有代碼中出現(xiàn)的阿拉伯?dāng)?shù)字需要給出注釋     * 程序中出現(xiàn)加密/解密 邏輯的操作地方,需要給出注釋說明過程(無論是系統(tǒng)還是自定義)
6 整體代碼風(fēng)格需要統(tǒng)一     * 代碼后面的”{“ 不需要單獨(dú)占用一行     * 邏輯運(yùn)算符 與 代碼之間空一格     * “#pragma mark -” 與下面的代碼之前不要空行     * 遵循一般性的代碼規(guī)范


[寫代碼規(guī)范35條小建議](http://www.itdecent.cn/p/71fdd1ae714c)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容