Swift代碼規(guī)范

團(tuán)隊(duì)的Swift代碼規(guī)范售葡,參考Swift Style GuideSwift 4.0 編碼規(guī)范,并根據(jù)團(tuán)隊(duì)實(shí)際需要做調(diào)整。

一缸匪、編碼格式

1.1 使用二元運(yùn)算符(+, -,==, 或->)的前后都需要添加空格

let value = 1 + 2

1.2 在逗號(hào)前面不添加空格类溢,后面加一個(gè)空格

let titleArray = [1, 2, 3, 4, 5]

1.3 在冒號(hào)前面不添加空格凌蔬,后面添加一個(gè)空格。

// 指定類型
let someViewController: SomeViewController

// 字典語法
let ninjaDictionary: [String: AnyObject] = [
    "fightLikeDairyFarmer": false,
    "disgusting": true
]

// 調(diào)用函數(shù)
someFunction(someArgument: "Kitten")

// 父類
class SomeViewController: UIViewController {
    /* ... */
}

// 協(xié)議
extension SomeViewController: UITableViewDataSource {
    /* ... */
}

1.3 左大括號(hào)不用另起一行

class SomeClass {
    func someMethod() {
        if x == y {
            /* ... */
        } else if x == z {
            /* ... */
        } else {
            /* ... */
        }
    }
    /* ... */
}

1.4 判斷語句中闯冷,只有一個(gè)判斷條件的時(shí)候砂心,不用加括號(hào)

if typeValue == 1 {
    // code
}

1.5 在訪問枚舉類型時(shí),使用點(diǎn)語法

enum Direction {
    case north
    case south
    case east
    case west
}
let currentDirection = .west

1.6 遵守Xcode內(nèi)置的縮進(jìn)格式(格式快捷鍵:CTRL-i)蛇耀,當(dāng)聲明的一個(gè)函數(shù)需要跨多行時(shí)辩诞,推薦使用Xcode默認(rèn)格式。

// Xcode針對(duì)跨多行函數(shù)聲明縮進(jìn)
func myFunctionWithManyParameters(parameterOne: String,
                                  parameterTwo: String,
                                  parameterThree: String) {
    // Xcode會(huì)自動(dòng)縮進(jìn)
    print("\(parameterOne) \(parameterTwo) \(parameterThree)")
}

// Xcode針對(duì)多行 if 語句的縮進(jìn)
if myFirstVariable > (mySecondVariable + myThirdVariable) && 
    myFourthVariable == .SomeEnumValue {
    // Xcode會(huì)自動(dòng)縮進(jìn)
    print("Hello, World!")
}

1.7 view controller的方法順序纺涤,根據(jù)生命周期排列躁倒。且在viewWillAppear、viewDidAppear中洒琢,需要先調(diào)用super方法秧秉。在viewWillDisappear、viewDidDisappear中衰抑,需最后調(diào)用super方法

    override func viewDidLoad() {
        super.viewDidLoad()
        // your code
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // your code
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        // your code
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        // your code
        super.viewWillDisappear(animated)
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        // your code
        super.viewDidDisappear(animated)
    }
    
    deinit {
        // your code
    }

    // other function...

二象迎、命名規(guī)范

2.1 常量,變量呛踊,函數(shù)砾淌,方法的命名規(guī)則使用小駝峰規(guī)則,首字母小寫谭网,類型名使用大駝峰規(guī)則汪厨,首字母大寫。

class MyClass: class {
    let myImageView: UIImageView
    let myName: String
}

2.2 當(dāng)命名里出現(xiàn)縮寫詞時(shí)愉择,縮寫詞要么全部大寫劫乱,要么全部小寫织中,以首字母大小寫為準(zhǔn)。(服務(wù)器返回model的key除外)

let htmlString = "https://www.baidu.com"
let urlString:  URLString
let userID:  UserID

class HTMLModel {
    //
}

2.3 bool類型命名時(shí)衷戈,使用is作為前綴(該條非強(qiáng)制狭吼,僅供參考)

var isMine: Bool = false

2.4 命名應(yīng)該具有描述性

// 推薦
class RoundAnimatingButton: UIButton { /* ... */ }

// 不推薦
class CustomButton: UIButton { /* ... */ }

2.5 不要簡(jiǎn)寫命名旁蔼,或用單個(gè)字母命名唤衫。(允許使用常見的縮寫,如html滋尉、url谦趣、id等)

// 推薦
class RoundAnimatingButton: UIButton {
    let animationDuration: NSTimeInterval
    func startAnimating() {
        let firstSubview = subviews.first
    }
}

// 不推薦
class RoundAnimating: UIButton {
    let aniDur: NSTimeInterval
    func srtAnmating() {
        let v = subviews.first
    }
}

2.6 如果原有命名不能明顯表明類型疲吸,則屬性命名內(nèi)要包括類型信息。

// 推薦
class ConnectionTableViewCell: UITableViewCell {
    let personImageView: UIImageView
    let animationDuration: NSTimeInterval
    // 作為屬性名的firstName前鹅,很明顯是字符串類型磅氨,所以不用在命名里不用包含String
    let firstName: String
    let popupViewController: UIViewController
    // 如果需要使用UIViewController的子類,如TableViewController, CollectionViewController, SplitViewController, 等嫡纠,需要在命名里標(biāo)名類型。
    let popupTableViewController: UITableViewController
    // 當(dāng)使用outlets時(shí), 確保命名中標(biāo)注類型延赌。
    @IBOutlet weak var submitButton: UIButton!
    @IBOutlet weak var emailTextField: UITextField!
    @IBOutlet weak var nameLabel: UILabel!
}

// 不推薦
class ConnectionTableViewCell: UITableViewCell {
    // 這個(gè)不是 UIImage, 不應(yīng)該以Image 為結(jié)尾命名除盏。
    let personImage: UIImageView
    // 這個(gè)不是String,應(yīng)該命名為 textLabel
    let text: UILabel
    // animation 不能清晰表達(dá)出時(shí)間間隔
    // 建議使用 animationDuration 或 animationTimeInterval
    let animation: NSTimeInterval
    // transition 不能清晰表達(dá)出是String
    // 建議使用 transitionText 或 transitionString
    let transition: String
    // 這個(gè)是ViewController挫以,不是View
    let popupView: UIViewController
    // 為了保持一致性者蠕,建議把類型放到變量的結(jié)尾,而不是開始掐松,如submitButton
    @IBOutlet weak var btnSubmit: UIButton!
    @IBOutlet weak var buttonSubmit: UIButton!
    // 在使用outlets 時(shí)踱侣,變量名內(nèi)應(yīng)包含類型名,或其他能表達(dá)類型含義的單詞大磺。
    // 這里建議使用 firstNameLabel
    @IBOutlet weak var firstName: UILabel!
}

2.7 數(shù)組的名稱抡句,推薦使用元素的復(fù)數(shù)命名。

// 推薦
var entities: [SPEntity] = []

// 不推薦
var entityList: [SPEntity] = []

三杠愧、語法規(guī)范

3.1 可選類型拆包取值時(shí)待榔,使用if let 判斷

if let data = result.data {
    // code
}

3.2 多個(gè)可選類型拆包取值時(shí),將多個(gè)if let 判斷合并

if let name = person.name, let age = person.age {
    // code
}

3.3 盡量不要使用 as! 或 try!(除非可以確定不會(huì)出現(xiàn)異常)

// 使用if let as流济?
if let name = person.name as? String {
    // code
}

3.4 當(dāng)對(duì)外接口不兼容時(shí)锐锣,使用@available(iOS x.0, *) 標(biāo)明接口適配的起始系統(tǒng)版本號(hào)

@available(iOS 8.0, *)
func myFunction() {
    // code
}

3.5 盡可能的多使用let,少使用var绳瘟。

3.6 當(dāng)拆包取值時(shí)雕憔,使用和被拆包取值變量相同的名稱。

guard let myVariable = myVariable else {
    return
}

3.7 在創(chuàng)建類常量的時(shí)候糖声,使用 static 關(guān)鍵詞修飾斤彼。

class MyTableViewCell: UITableViewCell {
    static let reuseIdentifier = String(MyTableViewCell)
    static let cellHeight: CGFloat = 80.0
}

3.8 推薦使用提前返回的策略分瘦,而不是 if 語句的嵌套。使用 guard 語句可以改善代碼的可讀性畅卓。

// 推薦
func eatDoughnut(atIndex index: Int) {
    guard index >= 0 && index < doughnuts else {
        // 如果 index 超出允許范圍擅腰,提前返回。
        return
    }
    let doughnut = doughnuts[index]
    eat(doughnut)
}

// 不推薦
func eatDoughnuts(atIndex index: Int) {
    if index >= 0 && index < donuts.count {
        let doughnut = doughnuts[index]
        eat(doughnut)
    }
}

3.9 當(dāng)需要判斷變量是否是nil翁潘,但又不需要訪問變量值的時(shí)候趁冈,推薦直接把它跟nil做比較。

// 推薦
if someOptional != nil {
    // do something
}

// 不推薦
if let _ = someOptional {
    // do something
}

四拜马、注釋

對(duì)于寫代碼渗勘,注釋就是解釋。除非在非常必要的時(shí)候進(jìn)行適當(dāng)?shù)淖⑨屃┟В駝t只會(huì)增加閱讀代碼“噪聲”旺坠。
盡量用注釋說明why(為什么這里代碼要這么寫),而不是what(這里代碼寫的是什么)

參考文檔
Swift Style Guide
Swift 4.0 編碼規(guī)范

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扮超,一起剝皮案震驚了整個(gè)濱河市取刃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌出刷,老刑警劉巖璧疗,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異馁龟,居然都是意外死亡崩侠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門坷檩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來却音,“玉大人,你說我怎么就攤上這事矢炼∠灯埃” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵句灌,是天一觀的道長(zhǎng)八拱。 經(jīng)常有香客問我,道長(zhǎng)涯塔,這世上最難降的妖魔是什么肌稻? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮匕荸,結(jié)果婚禮上爹谭,老公的妹妹穿的比我還像新娘。我一直安慰自己榛搔,他們只是感情好诺凡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布东揣。 她就那樣靜靜地躺著,像睡著了一般腹泌。 火紅的嫁衣襯著肌膚如雪嘶卧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天凉袱,我揣著相機(jī)與錄音芥吟,去河邊找鬼。 笑死专甩,一個(gè)胖子當(dāng)著我的面吹牛钟鸵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涤躲,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼棺耍,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了种樱?” 一聲冷哼從身側(cè)響起蒙袍,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嫩挤,沒想到半個(gè)月后害幅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俐镐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哺哼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佩抹。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖取董,靈堂內(nèi)的尸體忽然破棺而出棍苹,到底是詐尸還是另有隱情,我是刑警寧澤茵汰,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布枢里,位于F島的核電站,受9級(jí)特大地震影響蹂午,放射性物質(zhì)發(fā)生泄漏栏豺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一豆胸、第九天 我趴在偏房一處隱蔽的房頂上張望奥洼。 院中可真熱鬧,春花似錦晚胡、人聲如沸灵奖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓷患。三九已至骡尽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間擅编,已是汗流浹背攀细。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沙咏,地道東北人辨图。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像肢藐,于是被迫代替她去往敵國(guó)和親故河。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • 注: Copy 自 cocoachina 英文原文:Swift Style Guide 翻譯作者:碼農(nóng)網(wǎng) – 豆照...
    Mid_Chan閱讀 697評(píng)論 0 0
  • 1. 代碼格式 1.1 使用四個(gè)空格進(jìn)行縮進(jìn)吆豹。 1.2 每行最多160個(gè)字符鱼的,這樣可以避免一行過長(zhǎng)。 (Xcode...
    余一波_Bobby閱讀 5,902評(píng)論 1 3
  • 當(dāng)你試圖解決一個(gè)別人代碼中的問題時(shí)痘煤,難得不是怎么解決這個(gè)問題凑阶,而是先得找到、讀懂這段代碼衷快。 推薦文檔:https:...
    小小土豆dev閱讀 983評(píng)論 0 6
  • 法理學(xué)的天空群星閃耀宙橱,我們也一再在這篇輝煌的天幕下頭暈?zāi)垦!H欢喊危谶@眾多的先賢之中师郑,最使我心潮澎湃、如沐甘霖的调窍,...
    郭綠獅閱讀 1,699評(píng)論 1 1
  • “你想做一個(gè)體面的人宝冕,有點(diǎn)熟能生巧的倦怠,你想做一個(gè)麻木的人邓萨,有種信手拈來的自暴自棄地梨,你想做一個(gè)懷揣夢(mèng)想的人,卻步...
    二人余安閱讀 339評(píng)論 0 2