以下所有純屬個(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é)束