超全面的Swift编码规范(推荐)

2020-01-08 23:40:30丽君

当给函数参数命名时,要确保函数能够理解每个参数的目的。

代码风格

综合

尽可能多使用let,少使用var。
当需要遍历一个集合变形成另一个集合时,推荐使用函数flatMap,filter,和reduce。


// 推荐
let stringOfInts = [1, 2, 3].flatMap { String($0) }
// ["1", "2", "3"]
// 不推荐
var stringOfInts: [String] = []
for integer in [1, 2, 3] {
 stringOfInts.append(String(integer))
}

// 推荐
let evenNumbers = [4, 8, 15, 16, 23, 42].filter { $0 % 2 == 0 }
// [4, 8, 16, 42]
// 不推荐
var evenNumbers: [Int] = []
for integer in [4, 8, 15, 16, 23, 42] {
 if integer % 2 == 0 {
 evenNumbers(integer)
 }
}

如果变量类型可以依靠判断得出,不建议声明变量时指明类型。

如果一个函数有多个返回值,推荐使用 元组 而不是inout参数,如果这个元组在多个地方都会使用,建议使用typealias来定义这个元组,而如果返回的元组有三个或者三个以上的元素,建议使用结构体或类。


func pirateName() -> (firstName: String, lastName: String) {
 return ("Guybrush", "Threepwood")
}
let name = pirateName()
let firstName = name.firstName
let lastName = name.lastName

当使用委托和协议时,请注意避免出现循环引用,基本上是在定义属性的时候使用weak修饰。

在闭包里使用self的时候需要注意避免出现循环引用,使用捕获列表可以避免这一点。


functionWithClosure() { [weak self] (error) -> Void in
 // 方案 1
 self?.doSomething()
 // 或方案 2
 guard let strongSelf = self else {
 return
 }
 strongSelf.doSomething()
}

switch 模块中不用显式使用break。

断言流程控制的时候不要使用小括号。


// 推荐
if x == y {
 /* ... */
}
// 不推荐
if (x == y) {
 /* ... */
}

在写枚举类型的时候,尽量简写。


// 推荐
imageView.setImageWithURL(url, type: .person)
// 不推荐
imageView.setImageWithURL(url, type: AsyncImageView.Type.person)

在使用类方法的时候不用简写,因为类方法和枚举类型不一样,不能轻易地推导出上下文。


// 推荐
imageView.backgroundColor = UIColor.whiteColor()
// 不推荐
imageView.backgroundColor = .whiteColor()

不建议使用self,除非必须得要。

在写一个方法的时候,需要衡量这个方法将来是否会被重写,如果不是请用final关键字修饰,这样组织方法被重写。一般来说final修饰符可以优化编译速度,在合适的时候大胆的使用它吧。需要注意的是,在一个公开发布的代码库中使用final和在本地项目中使用final的影响差别很大。