Swift代码风格检测

Swift代码风格检测

使用一个Swift代码风格检测工具对于一个Swift初学者来说,应该算是一个很快了解语言特性的机会。

或者说任何一个语言的代码风格检测工具都会在某些层面上加强开发者对于这一门语言的理解。

作为一个OCer,之前一直沉浸于OC的开发中,后边转战Swift之后,写代码的时候总是喜欢带上一些OC中的特性,使得代码和Swift风格总是有些偏差, 感觉是在用OC的思想来写Swift代码一样。

每个语言都有很多自己的风格检测工具,大公司一般会有一套严格的代码风格检测工具,小公司的话可能大部分都是要靠开发者自己来把控这个了。

有些时候,即使你的代码可以在只有几个warning的状态下流畅的跑起来,但是也并不代表你的代码没有很多风格或者语法上的问题,只是编译器给你放行了而已。

工具

围绕这Swift也有很多第三方的代码检测工具,我找了几个烈在这里:

Swift Lint

其中star最多的就算是Swift Lint了,所以这次我们也直接选择这个作为我们代码风格检测的工具。

SwiftLint hooks into Clang and SourceKit to use the AST representation of your source files for more accurate results.

安装

SwiftLint的安装方法很简单,而且GitHub上也附带了中文的README

简单来说SwiftLint的安装方法分为两种模式

  • 全局安装:就是在你的电脑中安装SwiftLint,让你所有的项目都可以享受到SwiftLint的监管
  • 部分安装:就是针对于某一个具体的工程进行安装,不会影响到电脑中的其他项目

其中全局安装主要就是通过Homebrew来安装,而部分安装主要使用过CocoaPods来安装。

其中Homebrew安装时,只要运行以下命令即可

1
brew install swiftlint

而使用CocoaPods安装时,只需要和平时一样在Podfile里加入

1
pod ‘SwiftLint'

然后再运行

1
pod install

就可以了。这里有一个官方的建议:

This will download the SwiftLint binaries and dependencies in Pods/ during your next pod install execution and will allow you to invoke it via ${PODS_ROOT}/SwiftLint/swiftlint in your Script Build Phases.
This is the recommended way to install a specific version of SwiftLint since it supports installing a pinned version rather than simply the latest (which is the case with Homebrew).
Note that this will add the SwiftLint binaries, its dependencies’ binaries and the Swift binary library distribution to the Pods/ directory, so checking in this directory to SCM such as git is discouraged.

在下一次执行 pod install 时将会把 SwiftLint 的二进制文件和依赖下载到 Pods/ 目录下并且将允许你通过 ${PODS_ROOT}/SwiftLint/swiftlint 在 Script Build Phases 中调用 SwiftLint。
自从 SwiftLint 支持安装某个特定版本后,安装一个指定版本的 SwiftLint 是目前推荐的做法相比较于简单地选择最新版本安装的话(比如通过 Homebrew 安装的话)。
请注意这会将 SwiftLint 二进制文件、所依赖的二进制文件和 Swift 二进制库安装到 Pods/ 目录下,所以不推荐将此目录添加到版本控制系统(如 git)中进行跟踪。

使用

首先,为了能够让SwiftLint检查出的问题能够更好的显示在IDE上,我们需要在Xcode中配置一个新的脚本。

配置新脚本的步骤应该不用多少了吧,以防万一我还是把步骤写下来吧,图就不贴了。

  1. 点击Xcode中的项目
  2. 选择Targets下的你的项目名称
  3. 选择Build Phases
  4. 点击左上角“+”
  5. 选择 New Run Script Phase
  6. 将需要添加的内容写到新生成的Shell文本框里就可以了

如果是使用Homebrew来安装的话,需要添加如下代码:

1
2
3
4
5
if which swiftlint >/dev/null; then
swiftlint
else
echo “warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint”
fi

而如果使用的是CocoaPods来安装的,只需要声明一下:

1
“${PODS_ROOT}/SwiftLint/swiftlint”

接下来,就可以使用SwiftLint了,在Xcode中使用CMD+b编译试试看,这时候就可以看到满江红了!
❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌❌
⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️

别急着关呐!

这才是我们使用SwiftLint的原因啊,看着这些报错一点一点消失不是会有很大的成就感吗,而且在这个过程中,你也会学习到很多Swift的语言特性和技巧。

消除报错

首先,如果你的项目里引用了很多第三方库,而这些第三方库引起了很多SwiftLint的报错的话,我们是不对他负责的,所以我们首先要把第三方库当中的代码隔离掉。

这里我们需要新建一个配置文件,这个文件不仅可以隔离掉第三方代码,还可以禁用或启用指定的规则。

那么接下来,到我们项目的目录下,执行

1
touch .swiftlint.yml

有可能你会发现好像没有什么变化,没关系,因为这个文件是隐藏的,点击cmd+shift+。显示隐藏文件之后,就可以看到他了。

然后在文件中添加:

1
2
excluded:
- Pods

这时候就可以把Pods中的文件排除掉了,当然这里你还可以添加任何你想要添加的文件或文件夹。

除了隔离之外,上述说到的很多功能都可以通过这个配置文件来实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
disabled_rules: # 执行时排除掉的规则
- colon
- comma
- control_statement
opt_in_rules: # 一些规则仅仅是可选的
- empty_count
- missing_docs
# 可以通过执行如下指令来查找所有可用的规则:
# swiftlint rules
included: # 执行 linting 时包含的路径。如果出现这个 `—path` 会被忽略。
- Source
excluded: # 执行 linting 时忽略的路径。 优先级比 `included` 更高。
- Carthage
- Pods
- Source/ExcludedFolder
- Source/ExcludedFile.swift
# 可配置的规则可以通过这个配置文件来自定义
# 二进制规则可以设置他们的严格程度
force_cast: warning # 隐式
force_try:
severity: warning # 显式
# 同时有警告和错误等级的规则,可以只设置它的警告等级
# 隐式
line_length: 110
# 可以通过一个数组同时进行隐式设置
type_body_length:
- 300 # warning
- 400 # error
# 或者也可以同时进行显式设置
file_length:
warning: 500
error: 1200
# 命名规则可以设置最小长度和最大程度的警告/错误
# 此外它们也可以设置排除在外的名字
type_name:
min_length: 4 # 只是警告
max_length: # 警告和错误
warning: 40
error: 50
excluded: iPhone # 排除某个名字
identifier_name:
min_length: # 只有最小长度
error: 4 # 只有错误
excluded: # 排除某些名字
- id
- URL
- GlobalAPIKey
reporter: “Xcode” # 报告类型 (Xcode, json, csv, checkstyle, junit, html, emoji)

接下来再编译,你会看到报错可能会少了很多,但是还是有很多很多,接下来才是真正的战斗。

自动更正

什么?你说你懒得改?没关系,SwiftLint也帮你想到了。

你可以通过这个命令,来使用SwiftLint帮你自动修正检测到的错误。

但是一定一定一定要注意这个命令会覆盖你之前的内容,所以一定要在跑这个命令之前做好备份。好了接下来可以试试这个命令了。

1
swiftlint autocorrect

跑完之后,你会发现,报错已经被控制在可以接受的范围内了,这时候你就可以去针对代码着手修改你的报错了,比如

1
Force Try Violation: Force tries should be avoided. (force_try)

这种使用了try!的部分,autocorrect是不会帮你修改的。

规则

在修改报错的过程中,我们可以看到每一个报错或者是警告都会写出报错的原因,并且在最后会有一个括号,里边标记了一个词,这个词其实就是SwiftLint的70多条规则的ID,在这个Rule Directory Reference里,可以直接搜索括号里的内容,这边会详细的写出这个报错的原因,以及这条规则的详细信息,甚至还会给出引起报错和未引起报错的例子。

那么接下来就去修改你的报错吧!

最后

在修改报错的过程中,我觉得对于新入门Swift的人来说,能够学到很多东西,比如有一些强制装换的操作,你也会更深刻的去了解某些方法的使用,此外对于不规范的命名以及过长的函数,SwiftLint也会让你去把它进行解耦。

本文章仅限个人学习使用,如果有什么不对的欢迎大佬批评指正。

参考资料

Rule Directory Reference

SwiftLint:代码规范检查工具介绍 - 柳云居士 - 博客园

Xcode代码规范之SwiftLint配置 - 简书

Swift 编码规范 | iOS 开发者论坛