微雲swift編碼規範

收藏待读

微雲swift編碼規範

Good

func myFunc() {
}

class MyClass() {  
}

Bad

func myFunc() 
{
}

函數、類中間要空一行

Good

func myFunc1() {
}

func myFunc2() {
}

class MyClass1 {
}

Bad

func myFunc1() {
}
func myFunc2() {
}


class MyClass1 {
}

代碼邏輯不同塊之間,要空一行

Good

func process() {
    // do one thing
    doCode1()
    
    // do another thing
    doAnother()
}

Bad

func process() {
    // do one thing
    doCode1()
    // do another thing
    doAnother()
}

縮進為一個tab (4個空格的寬度)

空行里不能有空的tab、空格

二元運算符,前後都要有空格

Good

let i = 5 + 6
let r = i % 10

Bad

let i=5+6
let r=i%10

區間運算符兩邊也要有空格

Good

let range = 1 ..< 10

Bad

let range = 1..<10

逗號後面跟空格

Good

let arr = [1, 2, 3, 4]

Bad

let arr = [1,2,3,4]

注釋符號,與注釋內容之間加空格

Good

print("Hello")	// 打印Hello

Bad

print("Hello")//打印Hello

類繼承、參數名和類型之間等,冒號前面不加空格,但後面跟空格

Good

class MyClass: NSObject {
}

func myFunc(value: Int) {
}

Bad

class MyClass : NSObject {
}

func myFunc(value:Int) {
}

自定義操作符,聲明及實現,兩邊都要有空格隔開

Good

infix operator ||| : RxPrecedence
public func ||| (lhs: T, rhs: T) -> U {
}

Bad

infix operator |||: RxPrecedence
public func |||(lhs: T, rhs: T) -> U {
}

if後面的else,跟着上一個if的右括號

Good

if flag {
    // code
} else {
    // code
}

Bad

if flag
{
    // code
}
else
{
    // code
}

switch中,case跟switch左對齊

Good

switch value {
case 1:
    // code
case 2:
    // code
default:
    // code
}

Bad

switch value {
    case 1:
        // code
    case 2:
        // code
    default:
        // code
}

函數體長度不超過200行

單行不能超過200個字符

單類體長度不超過300行

實現每個協議時,在單獨的extension里來實現

Good

class MyViewController: UIViewController {
}

extension MyViewController: UITableViewDataSource {
}

extension MyViewController: UIScrollViewDelegate {
}

Bad

class MyViewController: UIViewController, UITableViewDataSource, UIScrollViewDelegate {
}

閉包中的單表達式,省略return

Good

let r = arr.filter { $0 % 2 == 0 }

Bad

let r = arr.filter { return $0 % 2 == 0 }

簡單閉包,寫在同一行

Good

let r = arr.filter { $0 % 2 == 0 }

Bad

let r = arr.filter {
    $0 % 2 == 0
}

尾隨閉包,在單閉包參數時才使用

Good

// 僅有一個閉包參數,使用尾隨閉包寫法
let r = arr.filter { $0 % 2 == 0 }

// 有兩個閉包參數,則不使用尾隨閉包寫法
arr.forEach(where: { $0 % 2 == 0 }, body: { print($0) })

Bad

let r = arr.filter({ $0 % 2 == 0 })

arr.forEach(where: { $0 % 2 == 0 }) { print($0) }

閉包聲明時,不需要寫參數名,只聲明類型即可

Good

func myFunc(completion: (Data) -> Void) {
}

Bad

func myFunc(completion: (_ data: Data) -> Void) {
}

使用[weak self]修飾的閉包,閉包開始判斷self的有效性

fetchList(param) { [weak self] lst in
    guard let self = self else {
        return
    }
    // code
}

過濾、轉換等,優先使用filter、map等高階函數簡化代碼

Good

let arr = [1, 2, 3, 4]
let total = arr.reduce(0, +)

Bad

let arr = [1, 2, 3, 4]
var total = 0
for i in arr {
    total += i
}

優先使用let定義變量,而不是var

能推斷出來的類型,不需要加類型限定

Good

let str = "Hello"
view.backgroundColor = .red

Bad

let str: String = "Hello"
view.backgroundColor = UIColor.red

變量聲明時,使用簡化寫法。

Good

var m = [Int]()

Bad

var n = Array()

單行注釋,優先使用 //

Good

print("Hello")	// Hello

Bad

print("Hello")	/* Hello */

異常的分支,提前用guard結束。

Good

func process(value: Int) {
    guard value > 0 else {
        return
    }

    // code
}

Bad

func process(value: Int) {
    if value > 0 {
        // code
    }
}

多個嵌套條件,能合併的,就合併到一個if中

Good

func process(v1: Int, v2: Int) {
    if v1 > 0, v2 > 0 {
        // code
    }
}

Bad

func process(v1: Int, v2: Int) {
    if v1 > 0 {
        if v2 > 0 {
            // code
        }
    }
}

儘可能使用private、fileprivate來限制作用域

Good

class MyClass {
    private func util() {   // 僅在類內部使用
    }
}

Bad

class MyClass {
    func util() {   // 僅在類內部使用
    }
}

盡量省略self,必要時才加

Good

extension Array where Element == Int {
    func myFunc() -> Int {
        return filter { $0 > 10 }.count
    }
}

Bad

extension Array where Element == Int {
    func myFunc() -> Int {
        return self.filter { $0 > 10 }.count
    }
}

不使用強制解包

Good

if let value = optional {
    // code
}

Bad

let value = optional!

不使用強制類型轉換

Good

if let r = value as? String {
    // code
}

Bad

let r = value as! String

不使用try!

Good

let r = try? decodeData()

Bad

let r = try! decodeData()

不使用隱式解包

Good

let opt: String?

Bad

let opt: String!

原文 : 微雲iOS團隊

相關閱讀

免责声明:本文内容来源于微雲iOS團隊,已注明原文出处和链接,文章观点不代表立场,如若侵犯到您的权益,或涉不实谣言,敬请向我们提出检举。