iOS編碼規(guī)范

以下所有純屬個(gè)人習(xí)慣,不喜勿噴

語(yǔ)言:應(yīng)該使用美國(guó)英語(yǔ)命名 如

UIColor? *myColor = [UIColor whiteColor];

而不是:

UIColor *myColour = [UIColor whiteColor];

注釋

1、方法注釋

注釋必須列出 函數(shù)名稱、功能描述、輸入?yún)?shù)、返回值描述、修改信息等

備注:方法名稱、功能描述要正確描述。

/**

* 方法名稱

* 功能描述

*

* @param 輸出參數(shù)1? 輸出參數(shù)描述

* @param 輸出參數(shù)2? 輸出參數(shù)描述

*

* @return 返回值? 返回值描述

*

* 其他說(shuō)明:如修改信息等

*

*/

2、對(duì)單條語(yǔ)句注釋

注釋應(yīng)與其描述的代碼相近,對(duì)代碼的注釋應(yīng)該放在其上方或右方相鄰位置,不可放在下面,需與上一行代碼隔開(kāi)一行空行

/* 代碼段1注釋*/

[代碼段1];

/* 代碼段2 注釋*/

[代碼段2];

3、方法大括號(hào)和其他大括號(hào)(if/else/switch/while 等.)總是在同一行語(yǔ)句打開(kāi)但在新行中關(guān)閉

應(yīng)該:

if (user.isHappy) {

//Do something

} else {

//Do something else

}

不應(yīng)該:

if (user.isHappy)

{

//Do something

}

else{

//Do something else

}

4、避免以對(duì)齊方式調(diào)用含有block代碼塊的方法

應(yīng)該:

// blocks are easily readable

[UIView animateWithDuration:1.0 animations:^{

// something

} completion:^(BOOL finished) {

// something

}];

不應(yīng)該:

// colon-aligning makes the block indentation hard to read

[UIView animateWithDuration:1.0

animations:^{

// something

}

completion:^(BOOL finished) {

// something

}];

命名

Apple命名規(guī)則盡可能堅(jiān)持長(zhǎng)的,描述性的方法和變量性

//應(yīng)該:

UIButton *settingsButton;

//不應(yīng)該:

UIButton *setBut;

備注:對(duì)于一些特殊類型的變量,命名時(shí)要帶上類型,如NSArray的變量命名為xxxArray,其他的如xxxDictionary,xxxSize等。這樣就可以從名稱上知道是什么類型的變量。千萬(wàn)不能將NSArray的變量命名為xxxDictionary。

const 常量命名

常量應(yīng)該使用駝峰式命名規(guī)則,所有單詞首字母大寫和加上與類名有關(guān)的前綴

//應(yīng)該:

static NSTimeInterval const kRWTTutorialViewControllerNavigationFadeAnimationDuration = 0.3;

//不應(yīng)該:

static NSTimeInterval const fadetime = 1.7;

一些常量前加特殊前綴,可以作為不同常量的區(qū)分,

如:

/**

* UserDefault Key 的常量前加 ‘kUDK’,

* NotificationName Key 的常量前加‘kNNK’,

* Dictionary Key? ? 的常量前加‘kDICK’,

* Model Key? ? 的常量前加? ? ‘kMDK’,

* Localizable Key? 的常量前加 ‘kLOCK’,

* 第三方服務(wù) Key? ? 的常量前加 ‘kVENDK’,

* 十六進(jìn)制顏色值? ? 的常量前加 ‘kHEXCOR’,

* 圖片資源名字? 的常量前加 ‘kIMGN’

*/

備注:‘k’for? ‘constant’? ‘K’ for ‘key’

宏定義命名

應(yīng)當(dāng)能夠表達(dá)它的用途,并且使用大寫字母表示,每個(gè)單詞間用’_’分開(kāi)

如果使用宏定義表示常量則前面必須加k表示理解為常量“constant“,不過(guò)建議使用const定義常量

類的命名

1.所有類名均以大寫字母開(kāi)頭,多單詞組合時(shí),后面單詞首字母大寫。類接口名必須有意義

2、所有類名前面添加前綴 “RJ”

3.繼承自UIView的類以View結(jié)尾。

如:RJOperatorUsersInfomationView

4.繼承自ViewController的類以ViewController結(jié)尾。

如:RJHomeViewController

5.所有保存數(shù)據(jù)的實(shí)體以Model結(jié)尾。

如:RJUserModel

屬性也是使用駝峰式

對(duì)于屬性的實(shí)例化,我們應(yīng)該盡可能使用延遲實(shí)例

@property (strong , nonatomic) UIView *descriptionView;

//應(yīng)該:

- (UIView *)descriptionView {

if (!_descriptionView) {

_descriptionView = [[UIView alloc] init];

}

return _descriptionView;

}

//不應(yīng)該

self.descriptionView = [[UIView alloc] init];

下劃線

當(dāng)使用屬性時(shí),實(shí)例變量應(yīng)該使用’self.’來(lái)訪問(wèn)和改變。

備注:在初始化方法里,實(shí)例變量(如:_variableName)應(yīng)該直接被使用來(lái)避免getters/setters潛在的副作用。

局部變量不應(yīng)該包含下劃線。

方法

在方法簽名中,應(yīng)該在方法類型(-/+ 符號(hào))之后有一個(gè)空格。在方法各個(gè)段之間應(yīng)該也有一個(gè)空格(符合Apple的風(fēng)格)。在參數(shù)之前應(yīng)該包含一個(gè)具有描述性的關(guān)鍵字來(lái)描述參數(shù)。

"and"這個(gè)詞的用法應(yīng)該保留。它不應(yīng)該用于多個(gè)參數(shù)來(lái)說(shuō)明,就像initWithWidth:height以下這個(gè)例子:

//應(yīng)該:

- (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;

//不應(yīng)該:

-(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.

變量

1.變量盡量以描述性的方式來(lái)命名。單個(gè)字符的變量命名應(yīng)該盡量避免,除了在for()循環(huán)。

2.星號(hào)表示變量是指針。例如, NSString *text 既不是 NSString* text 也不是 NSString * text,除了一些特殊情況下常量。

3.私有屬性應(yīng)該盡可能代替實(shí)例變量的使用。盡管使用實(shí)例變量是一種有效的方式,但更偏向于使用屬性來(lái)保持代碼一致性。

//應(yīng)該:

@interface RWTTutorial : NSObject

@property (nonatomic, strong) NSString *tutorialName;

@end

//不應(yīng)該:

@interface RWTTutorial : NSObject {

NSString *tutorialName;

}

屬性特性

所有屬性特性應(yīng)該顯式地列出來(lái),有助于新手閱讀代碼。屬性特性的順序應(yīng)該是nullable,nonatomic,readonly,strong

,與在APPLE 本身框架庫(kù)代碼一致。

//應(yīng)該:

@property (nonatomic, weak) IBOutlet UIView *containerView;

@property (nonatomic) NSString *tutorialName;

//不應(yīng)該:

@property (weak, nonatomic) IBOutlet UIView *containerView;

@property (strong, nonatomic) NSString *tutorialName;

代碼組織

在函數(shù)分組和protocol/delegate實(shí)現(xiàn)中使用 ‘#pragma mark – ’來(lái)分類方法,要遵守以下一般的結(jié)構(gòu):

#pragma mark - Lifecycle

- (instancetype)init {}

- (void)dealloc {}

- (void)viewDidLoad {}

- (void)viewWillAppear:(BOOL)animated {}

- (void)didReceiveMemoryWarning {}

#pragma mark - IBActions

- (IBAction)submitData:(id)sender {}

#pragma mark - Public

- (void)publicMethod {}

#pragma mark - Private

- (void)privateMethod {}

#pragma mark - Protocol conformance

#pragma mark - UITextFieldDelegate

#pragma mark - UITableViewDataSource

#pragma mark - UITableViewDelegate

#pragma mark - NSCopying

- (id)copyWithZone:(NSZone *)zone {}

#pragma mark - NSObject

- (NSString *)description {}

#pragma mark - Custom Accessors

- (void)setCustomProperty:(id)value {}

- (id)customProperty {}

黃金路徑

當(dāng)使用條件語(yǔ)句編碼時(shí),上邊的代碼應(yīng)該是"golden" 或 "happy"路徑。也就是不要嵌套if語(yǔ)句,多個(gè)返回語(yǔ)句也是OK。


//應(yīng)該:

- (void)someMethod {

if (![someOther boolValue]) {

return;

}

//Do something important

}


//不應(yīng)該:

- (void)someMethod {

if ([someOther boolValue]) {

//Do something important

}

}

換行符

換行符是一個(gè)很重要的主題,因?yàn)樗娘L(fēng)格指南主要為了打印和網(wǎng)上的可讀性。

例如:

self.productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];

//一行很長(zhǎng)的代碼應(yīng)該分成兩行代碼,下一行用兩個(gè)空格隔開(kāi)。

self.productsRequest = [[SKProductsRequest alloc]

initWithProductIdentifiers:productIdentifiers];

Init方法

Init方法應(yīng)該遵循Apple生成代碼模板的命名規(guī)則,返回類型應(yīng)該使用instancetype而不是id。

- (instancetype)init {

self = [super init];

if (self) {

// ...

}

return self;

}



類構(gòu)造方法

當(dāng)類構(gòu)造方法被使用時(shí),它應(yīng)該返回類型是instancetype而不是id。這樣確保編譯器正確地推斷結(jié)果類型。

@interface Airplane

+ (instancetype)airplaneWithType:(RWTAirplaneType)type;

@end

修改規(guī)范

1、新增代碼行

新增代碼行的前后應(yīng)有注釋行說(shuō)明。

//修改人,修改時(shí)間,修改說(shuō)明

新增代碼行

//修改結(jié)束

2、刪除代碼行

刪除代碼向的前后用注釋行說(shuō)明

//修改人,修改時(shí)間,修改說(shuō)明

要?jiǎng)h除的代碼行(將要?jiǎng)h除的語(yǔ)句進(jìn)行注釋)

//修改結(jié)束

3、修改代碼行

修改代碼行以注釋舊代碼行后再新增代碼行的方式進(jìn)行。

//修改人,修改時(shí)間,修改說(shuō)明

//修改前代碼行開(kāi)始

//修改前代碼行

//修改前代碼行結(jié)束

//修改后代碼行開(kāi)始

修改后代碼行

//修改結(jié)束

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 注釋規(guī)范 文件頭注釋 文件頭注釋采用如下格式,該注釋由xcode自動(dòng)生成。如果你對(duì)其他人的原始代碼作出重大的修改,...
    yangzming閱讀 795評(píng)論 0 1
  • 命名 Bundle id命名: 規(guī)則:采用反域名命名規(guī)則,全部使用小寫字母。一級(jí)包名為com,二級(jí)包名根據(jù)應(yīng)用進(jìn)行...
    Tippi閱讀 1,763評(píng)論 0 2
  • 一.代碼命名 一般性原則 最好是既清晰又簡(jiǎn)短,但不要為簡(jiǎn)短而喪失清晰性。 例如:removeObject:AtIn...
    睡不完懶覺(jué)閱讀 1,866評(píng)論 0 16
  • IOS開(kāi)發(fā)規(guī)范 公司新項(xiàng)目馬上要啟動(dòng),整理一篇規(guī)范,供參考。 命名規(guī)范 駝峰法,除第一個(gè)單詞之外,其他單詞首字母大...
    面皮大師閱讀 404評(píng)論 0 3
  • 整理了一下 Android 上 View 繪制的流程,繪制流程圖如下:
    牧秦丶閱讀 248評(píng)論 0 0

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