• SwiftLint 一款非常棒的用于强制检查 Swift 代码风格和规定的工具
  • 发布于 2个月前
  • 235 热度
    0 评论
前言
SwiftLint 是 Realm 出品的一个用于强制检查 Swift 代码风格和规定的一个工具。到目前为止,这个仓库在 Github 上有 18 万颗星。可见是一个非常受欢迎的库。SwiftLint 的原理是 Hook 了 Clang 和 SourceKit 从而能够使用 AST 来表示源代码文件的更多精确结果。

今天来讲讲如何在你的项目中使用。

安装
1、使用 Homebrew
在命令行中执行:
brew install swiftlint
2、使用 CocoaPods(推荐)
也可以直接在你的 swift 项目中 Podfile 文件中增加:
pod 'SwiftLint', :configuration => 'Debug'
一般来说只需要在 Debug 上安装就行了(无需带到线上),然后执行:
pod install
3、使用 Mint
命令行执行:
mint install realm/SwiftLint

使用方法
推荐使用 CocoaPods 安装 (我这里也用这种方式举例),这样多人开发的时候每个人无需再在电脑上安装一次,然后也能够很好的整合 SwiftLint 到 Xcode 体系中,从而可以使警告和错误显示到 Xcode 上。

打开 Xcode 你的项目,点击主 Target,选择 Build Phases,点击加号添加一个新的“Run Script Phase”,然后添加以下代码即可:

${PODS_ROOT}/SwiftLint/swiftlint --fix
${PODS_ROOT}/SwiftLint/swiftlint lint

因为你已经在 Podfile 中添加了 SwiftLint, pod install 之后会安装在 ${PODS_ROOT}/SwiftLint/swiftlint 这个目录,所以可以直接这么执行。这里涉及两个命令 --fix 用来自动矫正代码,lint 命令用来在 IDE 上显示警告或报错。

在 Xcode 15 中对 Build Settings 做了一些更改,因此,当你编译项目时,SwiftLint 会遇到与缺少文件权限相关的错误,解决办法是,打开 Build Settings,搜索 enable_user_script,将对应的选项改为 No 就行了。

此时当你编译项目时,swiftlint 会自动遍历你所有的代码,校验规范,然后根据规范来给出报错或者警告。
比如我的 AppDelegate 里的某个方法字符数超过了 120 个,就会给出一个警告,因为 SwiftLint 默认有一条规则是单行代码不能超过 120 个字符:

规则
随着 SwiftLint 不断发展,目前已经有超过 200 条规则了,你可以在 这个网站[1] 找到规则的更新列表和更多信息。
1、默认规则
目前有 94 条规则是默认开启的,不需要独立配置,就包括常见的单行不能超过 120 字符、空格规范、换行规范等等。

2、Opt-In 规则
Opt-In 规则目前有 134 条,默认不开启,如果想要开启,需要通过配置文件来单独声明,其中包括一些可开可不开的规范,比如把 count > 0 换成 isEmpty、限制强制解包等等。

3、如何在代码中关闭某个规则
有时候可能因为某些原因,不得不在特定的代码中关掉某个规则,SwiftLint 也给出了相关的命令:
// swiftlint:disable <rule1> [<rule2> <rule3>...]
比如我想关掉单行 120 字符的规则,可以在 AppDelegate 文件中写入:
// swiftlint:disable line_length
line_length 就是限制 120 字符的规则名。

当 SwiftLint 读到这行注释时,就会开始在下一行代码中忽略 line_length 这个规则,记得在需要开启时用 enable 来开启,比如我需要关掉 AppDelegate 这个文件所有代码的 line_length 规则,则可以在第一行写
// swiftlint:disable line_length
在最后一行写 enable 来重新开启:
// swiftlint:enable line_length
也可以使用 swiftlint:disable all 来禁用所有规则。

还支持在 disable 关键字后增加更确切的参数,比如:
swiftlint:disable:next line_length : 关闭下一行代码的 line_length 规则
swiftlint:disable:this line_length : 关闭本行代码的 line_length 规则

swiftlint:disable:previous line_length : 关闭上一行代码的 line_length 规则


自定义配置
前面说了如果想打开 Opt-In 规则需要用到配置文件,可以在你项目的根目录下添加一个 .swiftlint.yml 文件的方式来配置 SwiftLint。可以被配置的参数有:
disabled_rules: 关闭某些默认开启的规则。
opt_in_rules: 一些规则是可选的。
only_rules: 不可以和 disabled_rules 或者 opt_in_rules 并列。类似一个白名单,只有在这个列表中的规则才是开启的。
我这里来举个例子,我要禁用默认开启的 line_length 规则,并开启 Opt-In 规则中的 empty_count 规则,那么我的 .swiftlint.yml 文件为:
disabled_rules:
  - line_length

opt_in_rules:
  - empty_count
然后再次运行项目,发现 line_length 的警告没有了。当我使用 count == 0 来判空时,SwiftLint 给我了一个警告,这个就是 empty_count 规则在起作用:

SwiftLint 还支持一些更精细的配置,比如 line_length 默认 120 个字符,我觉得太少了,那么你可以在 .swiftlint.yml 文件中新增一行来改成 150 个:
opt_in_rules:
  - empty_count

line_length: 150
更多配置相关的内容可以到 SwiftLint 官方文档[2]中查看

参考资料
[1]SwiftLint 规则列表: https://realm.github.io/SwiftLint/rule-directory.html
[2]SwiftLint 官方文档: https://github.com/realm/SwiftLint/blob/main/README_CN.md
用户评论