移動端iOS開發(fā)規(guī)范文檔
目錄
- 格式與換行
- 命名
-
Objective-C下的cocoa編碼規(guī)范 - 注釋要求
- 其他
- 參考文檔
https://github.com/NYTimes/objective-c-style-guide
序
- 此文檔根據(jù)
apple,google以及行業(yè)中比較知名的OC編碼規(guī)范整理歸納而成,旨在為大家的iOS開發(fā)規(guī)范提供一份簡單,統(tǒng)一的執(zhí)行標準。
1. 格式與換行
1.1 使用Xcode默認的設(shè)置使用4個空格來縮進。
- 在
Xcode > Preferences > Text Editing將Tab和自動縮進都設(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 if和case語句
- 不論
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屬性和其他屬性,如果所有的gettersandsetters放在前面,就會導致在implementation代碼頂部有大量的初始化代碼,這就導致主要的邏輯代碼挪到后面去了,其他人閱讀代碼是不太方便的。
6 參考文檔
未盡事項可參考以下連接