Swift4.0编码规范

2018-07-03  本文已影响74人  zhangferry
swift.png

这篇文章是基于SwiftLint总结的Swift4.0编码规范。这个规范还在不断的扩充中,我挑了其中我认为需要注意的几点,做了以下记录。因为是规范,不存对与错,只存在是否合适,是否有利于别人阅读咱们的代码。另外为了方便说明每条规则,我在规则下面都加了几条推荐的写法和不推荐的写法。

命名规范

1.标识符名称应该只包含字母数字字符,以小写字符开头,或者只包含大写字母。在上述情况下,变量名可以在声明静态和不可变的时候以大写字母开头。变量名不应该太长或太短。

let myLet = 0 //推荐
let i = 0//不推荐,太短
  1. 类型名应该只包含字母数字字符,以大写字符开头,长度在3到40个字符之间。
class MyType {}
  1. Bool类型命名时,使用is作为前缀;Bool类型声明时,更应该选择非可选性。
let isEnable: Bool = false//推荐
let foo: Bool? = nil //不推荐
  1. Swift中类别(类,结构体)在编译时会把模块设置为默认的命名空间,所以不用为了区分类别而添加前缀,比如XYHomeViewController,但是为了和引用的第三方库作区分,建议可以继续使用前缀,以作为规范化处 理,结构更清晰。
  2. 数组和字典变量定义时需要标明泛型类型,并使用更简洁清晰的语法。
let list: [String] = []
let dict: [String:Int] = [:]
  1. 在指定类型时,冒号应该在标识符旁边,冒号后应有一个空格。
let abc: String = "def"//推荐
let abd : String = "def"//不推荐
func abc(def: Void, ghi: Void) {}//推荐

函数使用

  1. 函数的行数应该控制在40行或更短,不包括注释和空格
  2. 一行的长度应为120个字符或更少
  3. 默认参数应该出现在参数列表末尾
func foo(x: String, y: Int = 0, z: CGFloat = 0) {}//推荐
  1. 与传统的便利功能相比,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()//推荐
  1. 当函数的第一个参数构成整个语句的介词时(如,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")
  }
}

书写规范

  1. 任何逗号前后都不应有空格,在逗号后面加一个空格
func abc(a: String, b: String) { }//推荐
  1. 打开括号前应该有一个空格,并与声明在同一行上。
1.func abc() {
  }//推荐
2.[].map() { $0 }//推荐
3.struct Rule
  {
  }//不推荐
  1. 尽量不使用'self.'除非方法参数与属性同名。
init(x: Int, y: Int, radius: Double) {
  self.x = x
  self.y = y
  self.radius = radius
}//推荐
self.tableView.delegate = self//不推荐
  1. 尽量避免使用强制解包,强制try。
if let url = NSURL(string: query)//推荐
let url = NSURL(string: query)!//不推荐
func a() throws {}; do { try a() } catch {}//推荐
func a() throws {}; ↓try! a()//不推荐
  1. 只读计算属性的声明可以去掉 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 {}
  1. 条件语句应该总是返回到下一行。
if true { break } else { return }//不推荐

9.注释的规范使用

// MARK: ... //'MARK:' 前后均有空格
// FIXME: - ...// '-'前后有空格

10.不要遗留FIXMTODO,要解决掉
11.所有声明都应该显式地指定访问控制级别的关键字。

private let address: String//推荐
var age: Int = 0 //不推荐

12.一个文件的内容不应该超过400行
13.每一行的末尾,避免出现分号

let title: String = "ferry";//不推荐![swift.png](https://img.haomeiwen.com/i1059465/c6e0783ae43b74ec.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
上一篇 下一篇

猜你喜欢

热点阅读