你应该在 iOS 项目中使用 SwiftLint

关注我,每天分享一个关于 iOS 的新知识

前言

SwiftLint 是 Realm 出品的一个用于强制检查 Swift 代码风格和规定的一个工具。到目前为止,这个仓库在 Github 上有 18 万颗星。可见是一个非常受欢迎的库。

SwiftLint 的原理是 Hook 了 Clang 和 SourceKit 从而能够使用 AST 来表示源代码文件的更多精确结果。

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

安装

1、使用 Homebrew

在命令行中执行:

2、使用 CocoaPods(推荐)

也可以直接在你的 swift 项目中 Podfile 文件中增加:

ini 复制代码
pod 'SwiftLint', :configuration => 'Debug'

一般来说只需要在 Debug 上安装就行了(无需带到线上),然后执行:

3、使用 Mint

命令行执行:

复制代码
mint install realm/SwiftLint

使用方法

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

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

bash 复制代码
${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、默认规则

目前有 94 条规则是默认开启的,不需要独立配置,就包括常见的单行不能超过 120 字符、空格规范、换行规范等等。

2、Opt-In 规则

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

3、如何在代码中关闭某个规则

有时候可能因为某些原因,不得不在特定的代码中关掉某个规则,SwiftLint 也给出了相关的命令:

xml 复制代码
// swiftlint:disable <rule1> [<rule2> <rule3>...]

比如我想关掉单行 120 字符的规则,可以在 AppDelegate 文件中写入:

arduino 复制代码
// swiftlint:disable line_length

line_length 就是限制 120 字符的规则名。

当 SwiftLint 读到这行注释时,就会开始在下一行代码中忽略 line_length 这个规则,记得在需要开启时用 enable 来开启,比如我需要关掉 AppDelegate 这个文件所有代码的 line_length 规则,则可以在第一行写

arduino 复制代码
// swiftlint:disable line_length

在最后一行写 enable 来重新开启:

arduino 复制代码
// 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 文件为:

makefile 复制代码
disabled_rules:
  - line_length

opt_in_rules:
  - empty_count

然后再次运行项目,发现 line_length 的警告没有了。

当我使用 count == 0 来判空时,SwiftLint 给我了一个警告,这个就是 empty_count 规则在起作用:

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

makefile 复制代码
opt_in_rules:
  - empty_count

line_length: 150

更多配置相关的内容可以到 SwiftLint 官方文档中查看

参考资料

1

SwiftLint 规则列表: realm.github.io/SwiftLint/r...

2

SwiftLint 官方文档: github.com/realm/Swift...

这里每天分享一个 iOS 的新知识,快来关注我吧

本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
问道飞鱼1 小时前
【移动端知识】移动端多 WebView 互访方案:Android、iOS 与鸿蒙实现
android·ios·harmonyos·多webview互访
mascon2 小时前
U3D打包IOS的自我总结
ios
名字不要太长 像我这样就好2 小时前
【iOS】继承链
macos·ios·cocoa
karshey3 小时前
【IOS webview】IOS13不支持svelte 样式嵌套
ios
潜龙95273 小时前
第4.3节 iOS App生成追溯关系
macos·ios·cocoa
游戏开发爱好者812 小时前
iOS App 电池消耗管理与优化 提升用户体验的完整指南
android·ios·小程序·https·uni-app·iphone·webview
程序员老刘18 小时前
AI智能体正在颠覆App开发,不转型就淘汰
flutter·客户端·mcp
神策技术社区19 小时前
iOS 全埋点点击事件采集白皮书
大数据·ios·app
wuyoula20 小时前
iOS V2签名网站系统源码/IPA在线签名/全开源版本/亲测
ios
2501_9159184120 小时前
iOS 性能监控工具全解析 选择合适的调试方案提升 App 性能
android·ios·小程序·https·uni-app·iphone·webview