你应该在 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新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
DisonTangor13 小时前
苹果发布iOS 18.2首个公测版:Siri接入ChatGPT、iPhone 16拍照按钮有用了
ios·chatgpt·iphone
- 羊羊不超越 -13 小时前
App渠道来源追踪方案全面分析(iOS/Android/鸿蒙)
android·ios·harmonyos
2401_865854881 天前
iOS应用想要下载到手机上只能苹果签名吗?
后端·ios·iphone
HackerTom2 天前
iOS用rime且导入自制输入方案
ios·iphone·rime
良技漫谈2 天前
Rust移动开发:Rust在iOS端集成使用介绍
后端·程序人生·ios·rust·objective-c·swift
2401_852403552 天前
高效管理iPhone存储:苹果手机怎么删除相似照片
ios·智能手机·iphone
星际码仔2 天前
【动画图解】是怎样的方法,能被称作是 Flutter Widget 系统的核心?
android·flutter·ios
emperinter2 天前
WordCloudStudio:AI生成模版为您的文字云创意赋能 !
图像处理·人工智能·macos·ios·信息可视化·iphone
关键帧Keyframe2 天前
音视频面试题集锦第 7 期
音视频开发·视频编码·客户端
关键帧Keyframe2 天前
音视频面试题集锦第 8 期
ios·音视频开发·客户端