类、函数等,左大括号不另一起行,并且跟前面留有空格
Good
1 | func myFunc() { |
Bad
1 | func myFunc() |
函数、类中间要空一行
Good
1 | func myFunc1() { |
Bad
1 | func myFunc1() { |
代码逻辑不同块之间,要空一行
Good
1 | func process() { |
Bad
1 | func process() { |
缩进为一个tab (4个空格的宽度)
空行里不能有空的tab、空格
二元运算符,前后都要有空格
Good
1 | let i = 5 + 6 |
Bad
1 | let i=5+6 |
区间运算符两边也要有空格
Good
1 | let range = 1 ..< 10 |
Bad
1 | let range = 1..<10 |
逗号后面跟空格
Good
1 | let arr = [1, 2, 3, 4] |
Bad
1 | let arr = [1,2,3,4] |
注释符号,与注释内容之间加空格
Good
1 | print("Hello") // 打印Hello |
Bad
1 | print("Hello")//打印Hello |
类继承、参数名和类型之间等,冒号前面不加空格,但后面跟空格
Good
1 | class MyClass: NSObject { |
Bad
1 | class MyClass : NSObject { |
自定义操作符,声明及实现,两边都要有空格隔开
Good
1 | infix operator ||| : RxPrecedence |
Bad
1 | infix operator |||: RxPrecedence |
if后面的else,跟着上一个if的右括号
Good
1 | if flag { |
Bad
1 | if flag |
switch中,case跟switch左对齐
Good
1 | switch value { |
Bad
1 | switch value { |
函数体长度不超过200行
单行不能超过200个字符
单类体长度不超过300行
实现每个协议时,在单独的extension里来实现
Good
1 | class MyViewController: UIViewController { |
Bad
1 | class MyViewController: UIViewController, UITableViewDataSource, UIScrollViewDelegate { |
闭包中的单表达式,省略return
Good
1 | let r = arr.filter { $0 % 2 == 0 } |
Bad
1 | let r = arr.filter { return $0 % 2 == 0 } |
简单闭包,写在同一行
Good
1 | let r = arr.filter { $0 % 2 == 0 } |
Bad
1 | let r = arr.filter { |
尾随闭包,在单闭包参数时才使用
Good
1 | // 仅有一个闭包参数,使用尾随闭包写法 |
Bad
1 | let r = arr.filter({ $0 % 2 == 0 }) |
闭包声明时,不需要写参数名,只声明类型即可
Good
1 | func myFunc(completion: (Data) -> Void) { |
Bad
1 | func myFunc(completion: (_ data: Data) -> Void) { |
使用[weak self]修饰的闭包,闭包开始判断self的有效性
1 | fetchList(param) { [weak self] lst in |
过滤、转换等,优先使用filter、map等高阶函数简化代码
Good
1 | let arr = [1, 2, 3, 4] |
Bad
1 | let arr = [1, 2, 3, 4] |
优先使用let定义变量,而不是var
能推断出来的类型,不需要加类型限定
Good
1 | let str = "Hello" |
Bad
1 | let str: String = "Hello" |
变量声明时,使用简化写法。
Good
1 | var m = [Int]() |
Bad
1 | var n = Array<Int>() |
单行注释,优先使用 //
Good
1 | print("Hello") // Hello |
Bad
1 | print("Hello") /* Hello */ |
异常的分支,提前用guard结束。
Good
1 | func process(value: Int) { |
Bad
1 | func process(value: Int) { |
多个嵌套条件,能合并的,就合并到一个if中
Good
1 | func process(v1: Int, v2: Int) { |
Bad
1 | func process(v1: Int, v2: Int) { |
尽可能使用private、fileprivate来限制作用域
Good
1 | class MyClass { |
Bad
1 | class MyClass { |
尽量省略self,必要时才加
Good
1 | extension Array where Element == Int { |
Bad
1 | extension Array where Element == Int { |
不使用强制解包
Good
1 | if let value = optional { |
Bad
1 | let value = optional! |
不使用强制类型转换
Good
1 | if let r = value as? String { |
Bad
1 | let r = value as! String |
不使用try!
Good
1 | let r = try? decodeData() |
Bad
1 | let r = try! decodeData() |
不使用隐式解包
Good
1 | let opt: String? |
Bad
1 | let opt: String! |