iOS項(xiàng)目結(jié)構(gòu)和代碼規(guī)范

  • 說兩句
    項(xiàng)目結(jié)構(gòu)和代碼風(fēng)格的重要性對(duì)于一個(gè)團(tuán)隊(duì)和項(xiàng)目來說不言而喻纬朝。首先項(xiàng)目結(jié)構(gòu)清晰合理砾肺,方便產(chǎn)品的快速迭代以及提高團(tuán)隊(duì)的開發(fā)效率碟贾;其次統(tǒng)一的規(guī)范可以促進(jìn)團(tuán)隊(duì)合作,降低維護(hù)成本悼院,以及有助于代碼審查伤为,減少bug處理。
    以下也只是列舉了個(gè)大概,只要養(yǎng)成了良好的代碼習(xí)慣绞愚,自然而然就會(huì)不斷的要求自己叙甸,提高自己。

一位衩、項(xiàng)目結(jié)構(gòu)

結(jié)構(gòu)如圖所示


iOS項(xiàng)目結(jié)構(gòu).png

結(jié)構(gòu)說明


  1. Classes
  • Extensions - 擴(kuò)展類
  • Common - 項(xiàng)目之間可公用方法
  • Global - 項(xiàng)目?jī)?nèi)公共方法裆蒸、變量、宏定義
  • Manager - 網(wǎng)絡(luò)請(qǐng)求類糖驴、數(shù)據(jù)庫(kù)操作類僚祷、緩存操作類
  • Model - 模型
  • ViewModel - 視圖模型(視情況需要增加)
  • Views - 視圖(根據(jù)功能模塊分出Item)
  • Constrollers - 控制器(根據(jù)功能模塊分出Item)
  • Category - 分類
  • Frameworks - 系統(tǒng)的框架
  • Tookis - 引用的第三方

二、Objective-C代碼規(guī)范

目錄


  • 代碼結(jié)構(gòu)
  • 空格
  • 注釋
  • 命名
  • 方法
  • 變量
  • 常量
  • 枚舉
  • 單例模式

代碼結(jié)構(gòu)


//ViewController 生命周期
#pragma mark - Lifecycle
- (void)viewDidLoad {} 
- (void)viewWillAppear:(BOOL)animated {}
- (void)didReceiveMemoryWarning {}

//通知事件
#pragma mark - Notificaion
- (void)keyboardWillAppear:(NSNotification *)aNotification {}

//手勢(shì)方法
#pragma mark - Gesture
- (void)backgroundViewTapGesture:(UITapGestureRecognizer *)sender {}

//按鈕以及其他控件Change事件
#pragma mark - Action
- (IBAction)registerButtonHandler:(id)sender {}

//代理事件
#pragma mark - UITextField Delegate
#pragma mark - UITableView Delegate & DataSource

//私有方法
#pragma mark - Private
- (void)initUI {}  //UI初始化方法
- (void)loadData {}  //加載數(shù)據(jù)方法
- (void)displayInfo {} //加載完UI顯示數(shù)據(jù)方法

- (void)privateMethod {}  //其他私有業(yè)務(wù)邏輯等方法

//共有方法
#pragma mark - Public
- (void)publicMethod {}  //外部調(diào)用方法

空格


  • 縮進(jìn)使用4個(gè)空格贮缕,確保在Xcode偏好設(shè)置來設(shè)置辙谜。
  • 方法大括號(hào)和其他大括號(hào)(if/else/switch/while 等.)總是在同一行語句打開但在新行中關(guān)閉。
  • 成員變量空格位置
@property (copy, nonatomic) NSString *userName; 
  • 方法空格位置
//- 后面 and 參數(shù)名之間 and 第一個(gè)大括號(hào)前 需要一個(gè)空格
 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 2;
}

注釋


當(dāng)需要注釋時(shí)感昼,注釋應(yīng)該用來解釋這段特殊代碼為什么要這樣做装哆。任何被使用的注釋都必須保持最新或被刪除。

一般都避免使用塊注釋定嗓,因?yàn)榇a盡可能做到自解釋蜕琴,只有當(dāng)斷斷續(xù)續(xù)或幾行代碼時(shí)才需要注釋。例外:這不應(yīng)用在生成文檔的注釋

命名


Apple命名規(guī)則盡可能堅(jiān)持蜕乡,特別是與這些相關(guān)的memory management rules(NARC)奸绷。
長(zhǎng)的,描述性的方法和變量命名是好的层玲。
變量的命名使用駝峰式号醉。

  • 控件命名必須加控件后綴
    應(yīng)該:
 UIButton *settingsButton;

不應(yīng)該:

UIButton *setBut;
  • 常見變量命名
@property (copy, nonatomic) NSString *userName;
//數(shù)組用List、s辛块、array后綴,推薦List
@property (strong, nonatomic) NSMutableArray *orderList;
//Bool類型用is前綴
@property (assign, nonatomic) BOOL isLogin;
  • 靜態(tài)變量加前綴
    應(yīng)該:
static NSTimeInterval const RWTTutorialViewControllerNavigationFadeAnimationDuration = 0.3;

不應(yīng)該:

static NSTimeInterval const fadetime = 1.7;
  • Model類命名
    使用項(xiàng)目前綴线椰,如"KB"-> KBUser

方法


在方法簽名中卿捎,應(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.

變量


  • 變量名稱采用英文命名且命名所見即所得旬蟋,明確變量的意義匆浙。不得存在拼音或含糊不清的英文表達(dá)
  • 屬性特征要寫明
@property (copy, nonatomic) NSString *userName;
@property (strong, nonatomic) NSMutableArray *orderList;
@property (assign, nonatomic) BOOL isLogin;

常量


常量首選內(nèi)聯(lián)字符串字面量或數(shù)字软能,因?yàn)槌A靠梢暂p易重用并且可以快速改變而不需要查找和替換。常量應(yīng)該聲明為 static 常量而不是 #define 了罪,除非非常明確地要當(dāng)做宏來使用难礼。
推薦:

static NSString * const NYTAboutViewControllerCompanyName = @"The New York Times Company";
static const CGFloat NYTImageThumbnailHeight = 50.0;

反對(duì):

#define CompanyName @"The New York Times Company"
#define thumbnailHeight 2
  • UserDefault Key常量
//UserDefalut Key
//使用前綴 kUDKey標(biāo)明
static NSString * const kUDKeyPrivacySwitchState = @"kUDKeyPrivacySwitchState";
  • Notification Key常量
//Notification Key
//使用小寫k開頭、以及Notification結(jié)尾
static NSString * const kAddDiarySucceedNotificaiton = @"kAddDiarySucceedNotificaiton";

枚舉


使用NS_ENUM進(jìn)行枚舉蛾茉,加上前綴

typedef NS_ENUM(NSInteger, KBUserSex) {
    KBUserSexMan = 1,          //男
    KBUserSexWoman = 2,        //女
};

單例模式


單例對(duì)象應(yīng)該使用線程安全模式來創(chuàng)建共享實(shí)例。

+ (instancetype)sharedInstance {
  static id sharedInstance = nil;
 
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    sharedInstance = [[self alloc] init];
  });
 
  return sharedInstance;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谦炬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子键思,更是在濱河造成了極大的恐慌,老刑警劉巖吼鳞,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異赔桌,居然都是意外死亡供炎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門纬乍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碱茁,“玉大人,你說我怎么就攤上這事仿贬∨ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵茧泪,是天一觀的道長(zhǎng)蜓氨。 經(jīng)常有香客問我,道長(zhǎng)队伟,這世上最難降的妖魔是什么穴吹? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮嗜侮,結(jié)果婚禮上港令,老公的妹妹穿的比我還像新娘啥容。我一直安慰自己,他們只是感情好顷霹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布咪惠。 她就那樣靜靜地躺著,像睡著了一般淋淀。 火紅的嫁衣襯著肌膚如雪遥昧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天朵纷,我揣著相機(jī)與錄音炭臭,去河邊找鬼。 笑死袍辞,一個(gè)胖子當(dāng)著我的面吹牛鞋仍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播革屠,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凿试,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了似芝?” 一聲冷哼從身側(cè)響起那婉,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎党瓮,沒想到半個(gè)月后详炬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寞奸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年呛谜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枪萄。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡隐岛,死狀恐怖聚凹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妒牙,我是刑警寧澤对妄,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站摩瞎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏旗们。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驰贷。 院中可真熱鬧洛巢,春花似錦、人聲如沸锹锰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痢士。三九已至茂装,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間城侧,已是汗流浹背彼妻。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歧强,地道東北人为肮。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓颊艳,卻偏偏與公主長(zhǎng)得像忘分,于是被迫代替她去往敵國(guó)和親白修。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • iOS編程規(guī)范0規(guī)范 0.1前言 為??高產(chǎn)品代碼質(zhì)量,指導(dǎo)廣大軟件開發(fā)人員編寫出簡(jiǎn)潔、可維護(hù)祖很、可靠、可 測(cè)試假颇、高效...
    iOS行者閱讀 4,459評(píng)論 21 35
  • 推薦文章:禪與 Objective-C 編程藝 前言 為??高產(chǎn)品代碼質(zhì)量,指導(dǎo)廣大軟件開發(fā)人員編寫出簡(jiǎn)潔笨鸡、可維護(hù)、...
    WolfTin閱讀 2,759評(píng)論 0 1
  • 概要 Objective-C是一門面向?qū)ο蟮膭?dòng)態(tài)編程語言哥桥,主要用于編寫iOS和Mac應(yīng)用程序泰讽。關(guān)于Objectiv...
    DreamMmMmM閱讀 1,167評(píng)論 0 7
  • 000
    南朝naasa閱讀 116評(píng)論 0 0
  • 1498年已卸,米開朗基羅(Michelangelo)用手中的刻刀記錄下他在世界藝術(shù)史上里程碑式的一頁(yè)硼一。他創(chuàng)作的雕像《...
    Sunny_side閱讀 14,701評(píng)論 3 22