以下所有純屬個(gè)人習(xí)慣道伟,不喜勿噴
語言:應(yīng)該使用美國(guó)英語命名 如
UIColor? *myColor = [UIColor whiteColor];
而不是:
UIColor *myColour = [UIColor whiteColor];
注釋
1、方法注釋
注釋必須列出 函數(shù)名稱睁蕾、功能描述、輸入?yún)?shù)、返回值描述、修改信息等
備注:方法名稱叠洗、功能描述要正確描述。
/**
* 方法名稱
* 功能描述
*
* @param 輸出參數(shù)1? 輸出參數(shù)描述
* @param 輸出參數(shù)2? 輸出參數(shù)描述
*
* @return 返回值? 返回值描述
*
* 其他說明:如修改信息等
*
*/
2旅东、對(duì)單條語句注釋
注釋應(yīng)與其描述的代碼相近灭抑,對(duì)代碼的注釋應(yīng)該放在其上方或右方相鄰位置,不可放在下面抵代,需與上一行代碼隔開一行空行
/* 代碼段1注釋*/
[代碼段1];
/* 代碼段2 注釋*/
[代碼段2];
3腾节、方法大括號(hào)和其他大括號(hào)(if/else/switch/while 等.)總是在同一行語句打開但在新行中關(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等访递。這樣就可以從名稱上知道是什么類型的變量。千萬不能將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表示理解為常量“constant“,不過建議使用const定義常量
類的命名
1.所有類名均以大寫字母開頭伴挚,多單詞組合時(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.’來訪問和改變偷厦。
備注:在初始化方法里商叹,實(shí)例變量(如:_variableName)應(yīng)該直接被使用來避免getters/setters潛在的副作用。
局部變量不應(yīng)該包含下劃線只泼。
方法
在方法簽名中剖笙,應(yīng)該在方法類型(-/+ 符號(hào))之后有一個(gè)空格。在方法各個(gè)段之間應(yīng)該也有一個(gè)空格(符合Apple的風(fēng)格)请唱。在參數(shù)之前應(yīng)該包含一個(gè)具有描述性的關(guān)鍵字來描述參數(shù)弥咪。
"and"這個(gè)詞的用法應(yīng)該保留。它不應(yīng)該用于多個(gè)參數(shù)來說明十绑,就像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.變量盡量以描述性的方式來命名聚至。單個(gè)字符的變量命名應(yīng)該盡量避免,除了在for()循環(huán)本橙。
2.星號(hào)表示變量是指針扳躬。例如, NSString *text 既不是 NSString* text 也不是 NSString * text,除了一些特殊情況下常量坦报。
3.私有屬性應(yīng)該盡可能代替實(shí)例變量的使用库说。盡管使用實(shí)例變量是一種有效的方式,但更偏向于使用屬性來保持代碼一致性片择。
//應(yīng)該:
@interface RWTTutorial : NSObject
@property (nonatomic, strong) NSString *tutorialName;
@end
//不應(yīng)該:
@interface RWTTutorial : NSObject {
NSString *tutorialName;
}
屬性特性
所有屬性特性應(yīng)該顯式地列出來潜的,有助于新手閱讀代碼。屬性特性的順序應(yīng)該是nullable,nonatomic,readonly,strong
字管,與在APPLE 本身框架庫代碼一致啰挪。
//應(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 – ’來分類方法,要遵守以下一般的結(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)使用條件語句編碼時(shí)嘲叔,上邊的代碼應(yīng)該是"golden" 或 "happy"路徑亡呵。也就是不要嵌套if語句,多個(gè)返回語句也是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è)空格隔開汁胆。
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)有注釋行說明。
//修改人琢感,修改時(shí)間丢间,修改說明
新增代碼行
//修改結(jié)束
2、刪除代碼行
刪除代碼向的前后用注釋行說明
//修改人猩谊,修改時(shí)間千劈,修改說明
要?jiǎng)h除的代碼行(將要?jiǎng)h除的語句進(jìn)行注釋)
//修改結(jié)束
3、修改代碼行
修改代碼行以注釋舊代碼行后再新增代碼行的方式進(jìn)行牌捷。
//修改人墙牌,修改時(shí)間,修改說明
//修改前代碼行開始
//修改前代碼行
//修改前代碼行結(jié)束
//修改后代碼行開始
修改后代碼行
//修改結(jié)束