Ficow 的 SwiftLint 实战总结

| Swift , iOS , Xcode , 实用工具 , CLI(命令行)

 

内容概览

  • 前言
  • 集成 SwiftLint
    • 注意事项
  • 测试 SwiftLint 集成效果
    • 在 Xcode 中确认
    • 在命令行中确认
  • 配置 SwiftLint 规则
    • 注意事项
    • 可用的规则
  • 开启 SwiftLint 自动纠正
    • 确认规则是否支持自动纠正
    • 自动纠正示例
    • 特殊的可自动纠正规则
  • 辅助命令
  • 总结

 

前言

 

SwiftLint 是一个很不错的 Swift 项目检查工具。其具有以下特点:
1.容易集成;
2.配置简单;
3.支持自动纠正部分代码;
4.甚至有一些官方的 中文教程

对于个人而言,如果你想改善代码质量,我相信它一定可以帮到你,而且效果会非常显著。
对于团队而言,如果项目中集成了 SwiftLint,PR 里面的评论数量会少很多,尤其是语法层面的一些低级错误。虽然集成了 SwiftLint 会增加些许的项目编译耗时,但是它可以有效地帮助团队提高代码审核的效率,同时也提高代码的质量。所以,这也是一举多得的好事。

 

集成 SwiftLint

 

可以直接参考官方的 中文教程 来集成。Ficow 在这里分享一些注意事项。

注意事项

1. 当 SwiftLint 无法运行时,在脚本中执行 exit 1 报错。请参考下面的示例脚本代码:

if [[ "$(uname -m)" == arm64 ]]; then
    export PATH="/opt/homebrew/bin:$PATH"
fi

if which swiftlint > /dev/null; then
  swiftlint
else
  echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
  exit 1 # 编译会失败并报错,便于发现 SwiftLint 集成问题
fi

2. 使用配置文件修改 Lint 的规则:

在项目根目录下新建一个 .swiftlint.yml 文件,然后把官方的 默认配置内容 复制到该文件中。

同时,记得将默认配置中 included 下面的 - Sources 改为你实际项目中的路径,尤其是主项目中代码所在的那个目录。比如:

included: # 执行 linting 时包含的路径。如果出现这个 `--path` 会被忽略。
  - Sources

否则,Xcode会报错:

然后,在脚本中添加 SwiftLint 要执行的配置文件路径:

if [[ "$(uname -m)" == arm64 ]]; then
    export PATH="/opt/homebrew/bin:$PATH"
fi

if which swiftlint > /dev/null; then
  swiftlint --config "$SRCROOT/.swiftlint.yml" # 使用指定的配置文件
else
  echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
  exit 1 # 编译会失败,而且会报错,便于发现 SwiftLint 集成问题
fi

3. 查看已启用的规则:

在命令行中执行 swiftlint rules -e 即可查看已启用的规则(enabled in your config 列):

 

测试 SwiftLint 集成效果

 

在 Xcode 中确认

按照官方教程里面的步骤集成完 SwiftLint 之后,在 Xcode 中直接编译项目即可确认 SwiftLint 是否成功集成。

默认开启的 Lint 规则里面包含了: vertical_whitespaceline_length,如果 SwiftLint 已经成功集成了,你多半会看到很多代码行出现这些警告。

在命令行中确认

在命令行中执行 swiftlint lint,如果你可以看到类似下面截图中的效果,说明集成成功:

 

配置 SwiftLint 规则

 

你可以直接参考官方的中文文档 配置,内容非常详细而且简单易懂。

注意事项

由于该配置文件是 .yml 格式,所以请你一定要注意配置项的 缩进 是否正确,还要避免输入 中文冒号 :,否则最终的配置结果很可能不是你想要的。

如果你想在某些代码行禁用某个规则,可以参考 在代码中关闭某个规则

可用的规则

你可以在这个页面查看和搜索所有的规则:

Rule Directory

该页面会说明每个规则的作用,以及配置参数,还有是否触发 lint 警告/错误的示例代码。
如果感兴趣,你可以看看 colon 这个例子。

 

开启 SwiftLint 自动纠正

 

确认规则是否支持自动纠正

在开启自动纠正之前,先在命令行中执行 swiftlint rules 确认该规则支持自动纠正(correctable 列为 yes):

或者,直接执行 swiftlint rules -c,输出所有支持自动纠正的规则。

如果需要查看 rules 相关的结果,可以通过 swiftlint rules --help 来查看 swiftlint rules 的帮助文档。

自动纠正示例

在此,Ficow 以 explicit_init 为例,展示其纠正效果。

首先,在配置文件中的 opt_in_rules 部分添加以下规则:

  - explicit_init

你可以参考该规则的文档页 explicit_init,在项目代码中添加一些违反规则的示例代码,比如:

    func foo() -> [String] {
        return [1].compactMap { String.init($0) }
    }

在命令行中运行以下命令,即可自动纠正代码:

swiftlint autocorrect --fix --format

Ficow根据官方的教程,直接执行 swiftlint autocorrect 之后没有纠正效果。

你可以看到,String.init($0) 被纠正为: String($)

如果项目中太多这种显式的 init 调用,自动纠正就可以有效地压缩源代码。对于大型项目来说,会很有帮助。

特殊的可自动纠正规则

有些规则不是简单修改 SwiftLint 规则就可以启用的,比如 unused_import

如果查看该规则的文档,我们会发现这样的说明:

Analyzer rule: Yes

对于 analyzer rule,需要执行 swiftLint analyze 而不是 swiftLint lint 命令。

而且,配置起来要相对复杂一些,你可以参考这篇帖子的做法:

 

辅助命令

 

查看 lint 警告分类统计结果

swiftlint lint | grep -o '([A-Za-z].*)' | sed 's/[()]//g' | uniq

从上图中可以看到,目前项目代码中存在以下问题:

line_length
explicit_init
line_length
unused_optional_binding

如果你想禁用一些规则,可以将它们添加到配置文件中的 disabled_rules 部分。

如果你想统计每种问题发生的次数,可以执行以下命令:

swiftlint lint | grep -o '([A-Za-z].*)' | sed 's/[()]//g' | uniq -c

本小节的脚本内容摘自 SwiftLint in Use - Medium

 

总结

 

SwiftLint 易集成,易学易用,还可以帮你优化项目。你也快用起来吧~

如果你在集成 SwiftLint 的过程中遇到了什么问题,这个 demo 项目 可供你参考。

如本文有谬误,或者你有任何改进建议,欢迎你留言与我交流,谢谢!

 

参考内容:

 
realm/SwiftLint - Github
GitHub Swift 风格指南
SwiftLint Rules
Rule Directory
SwiftLint in Use - Medium

觉得不错?点个赞呗~

本文链接:Ficow 的 SwiftLint 实战总结

转载声明:本站文章如无特别说明,皆为原创。转载请注明:Ficow Shen's Blog

评论区(期待你的留言)