移動端iOS開發(fā)規(guī)范文檔

移動端iOS開發(fā)規(guī)范文檔

目錄

  • 格式與換行
  • 命名
  • Objective-C下的cocoa編碼規(guī)范
  • 注釋要求
  • 其他
  • 參考文檔

https://github.com/NYTimes/objective-c-style-guide

  • 此文檔根據(jù)applegoogle以及行業(yè)中比較知名的OC編碼規(guī)范整理歸納而成,旨在為大家的iOS開發(fā)規(guī)范提供一份簡單,統(tǒng)一的執(zhí)行標準。

1. 格式與換行

1.1 使用Xcode默認的設(shè)置使用4個空格來縮進。

  • Xcode > Preferences > Text EditingTab 和自動縮進都設(shè)置為 4 個空格。

1.2 方法長度不操作100行,建議不超過80行,如果方法太長可以考慮提 取其中的一部分。

1.3 方法-和方法+和返回值前面的左括號間隔一個空格,方法參數(shù)直接間隔一個空格。

1.4 條件語句的格式采用蘋果推薦的代碼縮進方式。

  • 推薦的寫法

    BOOL isOk = YES;
    if (isOk) {
        //...
    }else{
        //...   
    }
    

2. 命名

2.1 命名統(tǒng)一使用駝峰命名法;只采納有廣為人知含義的縮寫,比如info、msg、UI、HTTP這類。自造的縮寫不被認可??傮w的命名原則是清晰和一致,避免歧義。

2.2 類名需要結(jié)合項目名稱來命名,確保整個項目中的自定義類的名稱開頭是統(tǒng)一的,同樣要確保類名需要大寫字母開頭。

2.3 類名命名需結(jié)合功能或者模塊,并且尾部要帶上該類的類型,比如UIViewController的子類命名為JasonIndexViewController。

2.4 方法命名小寫字母開頭(方法以大寫縮略詞開始的除外),文件夾首字母大寫開頭。不要使用下劃線開頭作為方法的前綴。

2.5 定義類的變量,不需要暴露的變量均放在實現(xiàn)文件里定義,同時視圖類變量,在類擴展下定義成屬性。數(shù)據(jù)類的變量定義在@implementation下的大括號內(nèi)。同時注意:局部變量不應該包含下劃線。


3. Objective-C下的cocoa編碼規(guī)范

3.1 使用#pragma mark 來分類方法,參考以下結(jié)構(gòu)

#pragma mark – Life Cycle

#pragma mark - Events

#pragma mark – Private Methods

#pragma mark - UITextFieldDelegate

#pragma mark - UITableViewDataSource

#pragma mark - UITableViewDelegate

#pragma mark - Custom Delegates

#pragma mark – Getters and Setters

3.2 重載系統(tǒng)方法的時候,如無特殊情況均需要先調(diào)用super的方法。

3.3 屬性必須指定其類型,比如(nonatomic,strong)

3.4 使用#import引入oc/oc++文件,使用#include引入c/c++文件

3.5 盡量減少公開的api接口數(shù)量。

3.6 枚舉的定義使用如下的方式

  • 下面是系統(tǒng)的 UISearchBarStyle 的枚舉定義的方式
typedef NS_ENUM(NSUInteger, UISearchBarStyle) {
    UISearchBarStyleDefault,    // currently UISearchBarStyleProminent
    UISearchBarStyleProminent,  // used my Mail, Messages and Contacts
    UISearchBarStyleMinimal     // used by Calendar, Notes and Music
}

4 注釋要求

4.1 新版Xcode自帶有添加注釋的功能

  • 單行注釋:在方法的地方按 Command+/
  • 標注的功能,快捷鍵是Command + Option + /
  • 需要在方法名的上面(空白)的地方按 Command + Option + / 才管用

4.2 在新建一個類的時候,需要在頭文件中添加注釋,來表明這個類的作用。

4.3 在創(chuàng)建接口類的時候,同樣需要在頭文件添加注釋,來表明這個類的用處。

4.4 一些過于簡單的注釋盡量不要加。


5 其他

5.1 ifcase語句

  • 不論if或者else下有一個還是多個語句,都必須帶上大括號。同樣case語句也是如此。
  • 推薦寫法
if (!error) {
  return success;
}

  • 不允許的寫法
if (!error)
  return success;
或  
if (!error) return success;

5.2 布爾值

  • 推薦的寫法:
if (someObject) {
    //...
}
if (![anotherObject boolValue]) {
    //...
}

5.3 三元操作符

  • 當需要提高代碼的清晰性和簡潔性時,三元操作符?:才會使用。
  • 推薦寫法
NSInteger value = 5;
result = (value != 0) ? x : y;

BOOL isHorizontal = YES;
result = isHorizontal ? x : y;
  • 不推薦的寫法
result = a > b ? x = c > d ? c : d : y;

5.4 Init方法

  • Init方法應該遵循Apple生成代碼模板的命名規(guī)則。返回類型應該使用instancetype而不是id
- (instancetype)init {
  self = [super init];
  if (self) {
    // ...
  }
  return self;
}

5.5 類構(gòu)造方法

  • 當類構(gòu)造方法被使用時,它應該返回類型是instancetype而不是id。這樣確保編譯器正確地推斷結(jié)果類型。
@interface Airplane
+ (instancetype)airplaneWithType:(RWTAirplaneType)type;
@end

5.6 CGRect函數(shù)

  • 推薦用法
CGRect frame = self.view.frame;

CGFloat x = CGRectGetMinX(frame);
CGFloat y = CGRectGetMinY(frame);
CGFloat width = CGRectGetWidth(frame);
CGFloat height = CGRectGetHeight(frame);
CGRect frame = CGRectMake(0.0, 0.0, width, height);
  • 不推薦的用法
CGRect frame = self.view.frame;

CGFloat x = frame.origin.x;
CGFloat y = frame.origin.y;
CGFloat width = frame.size.width;
CGFloat height = frame.size.height;
CGRect frame = (CGRect){ .origin = CGPointZero, .size = frame.size };


5.7 黃金路徑

  • 當使用條件語句編碼時,左手邊的代碼應該是"golden" 或 "happy"路徑。也就是不要嵌套if語句,多個返回語句也是OK。

  • 推薦寫法

- (void)someMethod {
  if (![someOther boolValue]) {
    return;
  }

  //Do something important
}
  • 不推薦的寫法
- (void)someMethod {
  if ([someOther boolValue]) {
    //Do something important
  }
}

5.8 單例模式

  • 單例對象應該使用線程安全模式來創(chuàng)建共享實例。
+ (instancetype)sharedInstance {
  static id sharedInstance = nil;

  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    sharedInstance = [[self alloc] init];
  });

  return sharedInstance;
}

5.9 布局中的空格

  • 每個方法或者功能塊之間為了結(jié)構(gòu)清晰,應當有且只有一行空格。
@interface SomeClass:NSObject

@property (noatomic, strong) UIView *aView

- (void)someMethod;

@end

@implementation SomeClass

- (void)setAView:(NSInteger )aview {

}

- (void)someMethod {

}
@end

5.10 Getters and Setters放在最底部

  • 控制器可能會有非常多的view屬性和其他屬性,如果所有的getters and setters放在前面,就會導致在implementation代碼頂部有大量的初始化代碼,這就導致主要的邏輯代碼挪到后面去了,其他人閱讀代碼是不太方便的。

6 參考文檔

未盡事項可參考以下連接

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

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

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