这是 Linkedin Swift 的代码规范,我挑出了我懂的地方进行翻译。
原文
代码格式
- 一个 tab 四行
- 一行别超过 160 个字符
- 确保每个文件的末尾都有换行符
- 确保任何地方的尾部没有空格
- 不要另起一行放开口括号
- 当在声明一个属性,常量,字典的 key ,函数参数,或者遵循一个协议,继承某个父类,冒号前面别加空格
- 一般来说,逗号后面要有一个空格符
- 二元操作符前后应该有空格,但是 ( 后面和 ) 前面不应该有空格
- 遵循 Xcode 的对齐方式。当声明一个跨越多行的函数的时候,最好用 Xcode 7.3 的对齐方式
- 当在调用一个有许多参数的函数的时候,每个参数一行并加额外的缩进
- 当在处理一个大的,大到你必须要分行写这个数组或者字典的时候,[] 的写法应该跟 () 在 if 语句中的写法一样
- 尽量避免多行的谓词
命名
- 不要使用 OC 式的前缀
- 类型名开头大写
- 其他的一般开头小写
- 当在处理缩略词或者全大写的名词,一般来说在代码中还是全大写,除非这个词你要放在开头,这样你每个字母都小写
- 所有的常量除了单例对象都应该是 static。所有的 static 的 constants 应该放在 enum 的容器内。enum 的命名必须是单数形式的,并且命名可以很明显的让人看出这是一个常量的容器。如果取不出一个好名字,就在名字后面加上 Constant.
- 命名不要使用缩略名
- 当变量或者常量的命名不能容易的看出类型信息的时候,加上类型信息
代码风格
- 尽量使用 let 而不是 var
- 尽量使用 map, filter, reduce 的组合
- 如果常量或者变量可以被编译器推断出类型,就不要写类型名
- 如果想一个函数返回多个值,尽量使用 tuple 而不是使用 inout 参数,并且最好使用带 labeled tuple。如果使用某一 tuple 多次,考虑使用 typelias。如果返回的 tuple 包含3个或者3个以上的值,考虑用 struct 或者 类
- 调用类方法,带上类名
- 当在写 methods 的时候,随时想着这个method 是否会被重写,如果不会 mark final。final methods 可以缩短编译的时间
- 当在声明函数和属性的时候,尽量用 static 而不是 class,因为用 static 声明的无法被重写,但是如果你想在子类重写你的 type property 或者 type function 考虑用 protocol
- 如果你的函数不需要参数,没什么副作用,只是用来返回一些的值的,最好用计算属性替代
修饰符访问
- access modifier keyword 写在最前面
- 尽量用 private 而不是 fileprivate
自定义操作符
- 最好用函数替代自定义操作符
Switch 语句和 enum
- 在使用 switch 语句的时候,如果所有的可能性是可以枚举完的,不要使用 default 语句,unuse case 用 break
- 如果你的 default 不应该被 reach 到,你应该 throw 一个 error
可选值
- 只有在 @IBOutlet 情况下才使用 ! 隐式解包
- 不要使用 as! or try!
- 不要使用 unowned
- 当对一个可选值解包的时候,尽量用同样的名字
协议
- 当实现协议的时候,用 //MARK:: 或者 extension
属性
- willSet/didSet 就使用默认的 newValue 和 oldvalue 就好了
闭包
- 如果闭包参数很明显,省略类型名是OK的,但是你写出来也没问题,可读性是最重要的
- 如果一个参数类型是一个闭包,除非有必要,该类型不需要用括号扩起来
数组
- 一般情况,避免直接通过数组下标去访问数组元素
- 不要使用 += or + 操作符来操作数组,使用 .append() 或者 .append(contentsOf:),因为后者有更好的性能, 像这种
let myNewArray = arr1 + arr2
可以用let myNewArray = [arr1, arr2].joined()
错误处理
- 一般来说,如果一个方法可能会失败,使用可选值会使得错误不那么明显,那就用 try catch 吧。提供了一种自定义错误的构造
struct Error: Swift.Error {
public let file: StaticString
public let function: StaticString
public let line: UInt
public let message: String
public init(message: String, file: StaticString = #file, function: StaticString = #function, line: UInt = #line) {
self.file = file
self.function = function
self.line = line
self.message = message
}
}
使用 guard 语句
- 我们采用遇到错误尽早退出的原则,在选择 if 还是 guard 的时候,最重要的是代码的可读性和减少 if - else 嵌套
文档/Comments
- 如果一个 function 的事件复杂度大于 O(1),你应该增加一个 doc comment。如果代码里加了一些非常 tricky 的技巧,应该记录在文档内。复杂的类,结构体,协议,枚举,属性都要写文档
- 看 Swift 的 Markup Comment Markup 链接