Swift4.0编码规范
2018-07-03 本文已影响74人
zhangferry

这篇文章是基于SwiftLint总结的Swift4.0编码规范。这个规范还在不断的扩充中,我挑了其中我认为需要注意的几点,做了以下记录。因为是规范,不存对与错,只存在是否合适,是否有利于别人阅读咱们的代码。另外为了方便说明每条规则,我在规则下面都加了几条推荐的写法和不推荐的写法。
命名规范
1.标识符名称应该只包含字母数字字符,以小写字符开头,或者只包含大写字母。在上述情况下,变量名可以在声明静态和不可变的时候以大写字母开头。变量名不应该太长或太短。
let myLet = 0 //推荐
let i = 0//不推荐,太短
- 类型名应该只包含字母数字字符,以大写字符开头,长度在3到40个字符之间。
class MyType {}
- Bool类型命名时,使用is作为前缀;Bool类型声明时,更应该选择非可选性。
let isEnable: Bool = false//推荐
let foo: Bool? = nil //不推荐
- Swift中类别(类,结构体)在编译时会把模块设置为默认的命名空间,所以不用为了区分类别而添加前缀,比如XYHomeViewController,但是为了和引用的第三方库作区分,建议可以继续使用前缀,以作为规范化处 理,结构更清晰。
- 数组和字典变量定义时需要标明泛型类型,并使用更简洁清晰的语法。
let list: [String] = []
let dict: [String:Int] = [:]
- 在指定类型时,冒号应该在标识符旁边,冒号后应有一个空格。
let abc: String = "def"//推荐
let abd : String = "def"//不推荐
func abc(def: Void, ghi: Void) {}//推荐
函数使用
- 函数的行数应该控制在40行或更短,不包括注释和空格
- 一行的长度应为120个字符或更少
- 默认参数应该出现在参数列表末尾
func foo(x: String, y: Int = 0, z: CGFloat = 0) {}//推荐
- 与传统的便利功能相比,Swift构造函数更受青睐。
CGPoint(x: 10, y: 10)//推荐
CGPointMake(10, 10)//不推荐
5.链式函数调用应该是在同一行上,或者是每行一个。多个参数时也遵循这个原则
let evenSquaresSum = [20, 17, 35, 4].filter { $0 % 2 == 0 }.map { $0 * $0 }.reduce(0, +)//推荐
let chain = a
.b(1, 2, 3)
.c { blah in
print(blah)
}
.d()//推荐
- 当函数的第一个参数构成整个语句的介词时(如,at, by, for, in, to, with
等),为第一个参数添加介词参数标签
func login(with username: String?, password: String?) {
//
}
7.未实现的函数应该标记为不可用
class ViewController: UIViewController {
@available(*, unavailable)
public required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
书写规范
- 任何逗号前后都不应有空格,在逗号后面加一个空格
func abc(a: String, b: String) { }//推荐
- 打开括号前应该有一个空格,并与声明在同一行上。
1.func abc() {
}//推荐
2.[].map() { $0 }//推荐
3.struct Rule
{
}//不推荐
- 尽量不使用'self.'除非方法参数与属性同名。
init(x: Int, y: Int, radius: Double) {
self.x = x
self.y = y
self.radius = radius
}//推荐
self.tableView.delegate = self//不推荐
- 尽量避免使用强制解包,强制try。
if let url = NSURL(string: query)//推荐
let url = NSURL(string: query)!//不推荐
func a() throws {}; do { try a() } catch {}//推荐
func a() throws {}; ↓try! a()//不推荐
- 只读计算属性的声明可以去掉 get 关键字和花括号。
class Foo {
var foo: Int {
return 20
}
}//推荐
6.更喜欢初始化器而不是可视化构造器。
let image = UIImage(named: aVariable)//推荐
let image = #imageLiteral(resourceName: "image.jpg")//不推荐
7.更喜欢使用isEmpty
而不是用count
判断是否为空。
[Int]().isEmpty//推荐
[Int]().count > 0//不推荐
myString == ""//不推荐
8.更喜欢用private
而不是fileprivate
修饰内容。
private extension String {}
- 条件语句应该总是返回到下一行。
if true { break } else { return }//不推荐
9.注释的规范使用
// MARK: ... //'MARK:' 前后均有空格
// FIXME: - ...// '-'前后有空格
10.不要遗留FIXM
和TODO
,要解决掉
11.所有声明都应该显式地指定访问控制级别的关键字。
private let address: String//推荐
var age: Int = 0 //不推荐
12.一个文件的内容不应该超过400行
13.每一行的末尾,避免出现分号
let title: String = "ferry";//不推荐