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

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

在使用一些语句如else,catch等紧随代码块关键字的时候,确保代码块和关键字在同一行。


if someBoolean {
 // 你想要什么
} else {
 // 你不想做什么
}
do {
 let fileContents = try readFile("filename.txt")
} catch {
 print(error)
}

访问控制修饰符

如果需要把访问修饰符放到第一个位置。


// 推荐
private static let kMyPrivateNumber: Int
// 不推荐
static private let kMyPrivateNumber: Int

访问修饰符不应该单独另起一行,应和访问修饰符描述的对象保持在同一行。


// 推荐
public class Pirate {
 /* ... */
}
// 不推荐
public
class Pirate {
 /* ... */
}

默认的访问修饰符是internal,可省略不写。

当一个变量需要被单元测试 访问时,需要声明为 internal 类型来使用@testable import {ModuleName}。 如果一个变量实际上是private 类型,而因为单元测试需要被声明为 internal 类型,确定添加合适的注释文档来解释为什么这么做。这里添加注释推荐使用 - warning: 标记语法。


/**
 这个变量是private 名字
 - warning: 定义为 internal 而不是 private 为了 `@testable`.
 */
let pirateName = "LeChuck"

自定义操作符

不推荐使用自定义操作符,如果需要创建函数代替。

在重写操作符之前,请慎重考虑是否有充分的理由一定要在全局范围内创建新的操作符,而不是使用其他策略。

你可以重载现有的操作符来支持新的类型(特别是==),但是新定义的必须保留操作符原来的含义,比如==必须用来测试是否相等并返回布尔值。

switch语句和枚举

使用swift/80902.html">swift语句时,如果选项是有限集合时,不要使用default,相反的,把一些不用的选项放到底部,并用break关键词阻止其执行。

应为swift中的switch选项默认是包含break的,所以不需要使用break关键字。

case 语句 应和 switch 语句左对齐,并在 标准的 default 上面。

当定义的选项有关联值时,确保关联值有恰当的名称,而不只是类型。


enum Problem {
 case attitude
 case hair
 case hunger(hungerLevel: Int)
}
func handleProblem(problem: Problem) {
 switch problem {
 case .attitude:
 print("At least I don't have a hair problem.")
 case .hair:
 print("Your barber didn't know when to stop.")
 case .hunger(let hungerLevel):
 print("The hunger level is (hungerLevel).")
 }
}

推荐尽可能使用fall through。

如果default 的选项不应该触发,可以抛出错误 或 断言类似的做法。


func handleDigit(digit: Int) throws {
 case 0, 1, 2, 3, 4, 5, 6, 7, 8, 9:
  print("Yes, (digit) is a digit!")
 default:
  throw Error(message: "The given number was not a digit.")
}