SwiftLint 自动规范代码工具(上)

简介: SwiftLint 自动规范代码工具(上)

技术选型


Infer vs SwiftLint:有什么区别?


什么是 Infer?

Facebook 可以在发布 Android 和 iOS 应用程序之前检测错误的工具。 Facebook Infer 是一个静态分析工具,如果您为 Infer 提供一些 Objective-C,Java 或 C 代码,它将产生一系列潜在的错误。任何人都可以使用 Infer 拦截重大错误,然后再将其发布到人们的手机中,并帮助防止崩溃或性能下降。(访问:fbinfer.com

Infer 效率高,支持增量分析,可小范围分析,但是可定制性不算最强,不支持 Swift。


什么是 SwiftLint?

实施 Swift 样式和约定的工具。它是一个基于 GitHub 的 Swift Style Guide 松散地实施 Swift 样式和约定的工具,它与 Clang 和 SourceKit 挂钩,可以使用源文件的 AST 表示获得更准确的结果。(访问:github.com/realm/Swift…

SwiftLint 使用简单,与 Xcode 紧密结合,更适用于包含 ObjC 和 Swift 代码的大型混合项目中。


image.png


使用场景


熟悉 Python 的同学一定对 Pylint 不会陌生,Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8,具体信息,请参阅参考资料)和有潜在问题的代码。


Python 是一门很强调格式的语言,毕竟人家连大括号都没有,反观 Swift,似乎不按照严格的规范编码也没有太大的问题?错!写出良好代码风格的代码,可能比能否写出高效的代码更为重要。于是,SwiftLint 就诞生了。


SwiftLint 是一个强制使用者按照 Github 的 Swift 编码规范指南来开发的一种工具,它会将所有不符合 Swift 规范的代码全部用 warning 标注出来,一些严重的违背规则的代码甚至让它无法通过编译(江山一片红),想想是不是就很刺激呢?


image.png


CodeReview 一般做这样几件事情:

  1. 代码风格规范统一
  2. 防止低效代码、冗余代码
  3. 防止出现可见的明显BUG

第一点,实在属于机械操作,就好像第一次工业革命的人工织布,是处在必然被淘汰的行列。 第二、三点富含了大量人脑的思考,属于暂时还无法替代的操作(AI时代应该可以)。


常用安装


版本要求

SwiftLint 工作于 SourceKit 这一层,所以 Swift 版本发生变化时它也能继续工作! 这也是 SwiftLint 轻量化的原因,因为它不需要一个完整的 Swift 编译器,它只是与已经安装在你的电脑上的官方编译器进行通信。

Swift 版本 最后一个 SwiftLint 支持版本
Swift 1.x SwiftLint 0.1.2
Swift 2.x SwiftLint 0.18.1
Swift 3.x SwiftLint 0.25.1
Swift 4.0-4.1.x SwiftLint 0.28.2
Swift 4.2.x SwiftLint 0.35.0
Swift 5.x 最新的


(1) 全局安装

全局安装就不得不提到我们的老朋友HomeBrew了,如果你没有安装,那么请看这里。 全局安装非常简单,首先我们需要通过 brew 命令安装 SwiftLint:

brew install swiftlint

然后添加编译脚本:

# Swiftlint
if which swiftlint >/dev/null; then
  swiftlint
else
  echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi

最后在脚本框中添加后:


image.png


OK,大功告成,就可以编译啦


(2) 局部安装

除了全局安装,我们也可以通过CocoaPods进行安装。在Podfile上添加相关的依赖:

pod 'SwiftLint'

然后跟全局方法一样,在 Run Script 中添加命令,但是内容有些许的不同:

# Swiftlint Pods
"${PODS_ROOT}/SwiftLint/swiftlint"


image.png


OK,接下来就让我们来试试看SwiftLint吧!


(3) fastlane 安装

你可以用fastlane官方的SwiftLint功能来运行SwiftLint作为你的Fastlane程序的一部分

swiftlint(
    mode: :lint,                            # SwiftLint模式: :lint (默认) 或者 :autocorrect
    executable: "Pods/SwiftLint/swiftlint", # SwiftLint的程序路径 (可选的). 对于用CocoaPods集成SwiftLint时很重要
    path: "/path/to/lint",                  # 特殊的检查路径 (可选的)
    output_file: "swiftlint.result.json",   # 检查结果输出路径 (可选的)
    reporter: "json",                       # 输出格式 (可选的)
    config_file: ".swiftlint-ci.yml",       # 配置文件的路径 (可选的)
    files: [                                # 指定检查文件列表 (可选的)
        "AppDelegate.swift",
        "path/to/project/Model.swift"
    ],
    ignore_exit_status: true,               # 允许fastlane可以继续执行甚至是Swiftlint返回一个非0的退出状态(默认值: false)
    quiet: true,                            # 不输出像‘Linting’和‘Done Linting’的状态日志 (默认值: false)
    strict: true                            # 发现警告时报错? (默认值: false)
)

官方还介绍 Mint 等安装方法,用得到自己去看吧~


使用方法


命令行

$ swiftlint help
Available commands:
   autocorrect  Automatically correct warnings and errors
   help         Display general or command-specific help
   lint         Print lint warnings and errors for the Swift files in the current directory (default command)
   rules        Display the list of rules and their identifiers
   version      Display the current version of SwiftLint


项目集成

在给项目初次接入SwiftLint的时候,你可能会被下面这样的情景给吓到:


image.png


但是呢,不用慌,我们可以看一下这是什么情况。仔细观察一番之后,我们会发现,绝大多数的Warning都是这个原因:


image.png


WTF?我这一行哪里有空格符?简直就是冤枉啊!但其实是这样的,虽然看起来好像没有空格符,但是在换行符之间不应该掺杂制表符,也就是说你实际的代码是这样的:

\n \tab \n

所以呢,人家的Warning也不是没有道理的嘛。那么我们该怎么来消除这些Warning呢? 首先,我们要确保,以后我们所码的代码不再出现这样的格式,所以我们需要把 Text Editing 里面的 Including whitespace-only lines 勾选上:



image.png


这样可以保证我们今后的换行不再出现制表符的警告,然后,我们就需要处理现有的代码。现有的代码,少说也有几万行,手动改不是要累死人?这个时候就轮到 SwiftLint 的命令行出场了。

我们将目录切换到工程的根目录之下,然后敲击如下命令:

swiftlint autocorrect

然后我们就会发现,所有的空格符Warning都消失了。这都得益于我们刚刚所进行的命令行操作,它会将已知的能够自动修复的Error和Warning都自动修复,大大的减轻了我们的工作量。


目录
相关文章
|
数据可视化 物联网 PyTorch
Stable Diffusion模型魔搭最佳实践:训一只你的萌柯基
Stable Diffusion模型魔搭最佳实践:训一只你的萌柯基
微信分享报错 wxlog:Error:fail to load Keychain status:-25300 解决办法
微信分享报错 wxlog:Error:fail to load Keychain status:-25300 解决办法
3176 0
|
关系型数据库 MySQL
MySQL · 新特性分析 · 5.7中Derived table变形记
Derived table实际上是一种特殊的subquery,它位于SQL语句中FROM子句里面,可以看做是一个单独的表。MySQL5.7之前的处理都是对Derived table进行Materialize,生成一个临时表保存Derived table的结果,然后利用临时表来协助完成其他父查询的操作,比如JOIN等操作。MySQL5.7中对Derived table做了一个新特性。该特性允许将符合
7334 0
|
监控 关系型数据库 MySQL
MHA搭建教程
MHA搭建教程
180 0
|
10月前
|
Kubernetes API 调度
【赵渝强老师】Kubernetes的体系架构
本文介绍了Kubernetes的体系架构及其核心组件。Kubernetes采用主从分布式架构,由master主节点和多个node工作节点组成。master节点负责集群管理和调度,运行API Server、scheduler、controller-manager等服务组件;node节点运行kubelet、kube-proxy和Docker容器守护进程,负责实际业务应用的运行。文章还简要介绍了Kubernetes的附加组件及其作用。
160 5
|
10月前
|
存储 监控 安全
数据泄露后的应对措施:个人和企业的行动指南
数据泄露后的应对措施:个人和企业的行动指南
1029 2
基于GA遗传优化的TSP问题最优路线规划matlab仿真
本项目使用遗传算法(GA)解决旅行商问题(TSP),目标是在访问一系列城市后返回起点的最短路径。TSP属于NP-难问题,启发式方法尤其GA在此类问题上表现出色。项目在MATLAB 2022a中实现,通过编码、初始化种群、适应度评估、选择、交叉与变异等步骤,最终展示适应度收敛曲线及最优路径。
500 29
|
算法 Perl
【光波电子学】基于MATLAB的多模光纤模场分布的仿真分析
本文介绍了基于MATLAB的多模光纤模场分布仿真分析,详细阐述了多模光纤的概念、实现方法、仿真技术,并利用模式耦合方程分析方法,通过理论和仿真模型设计,展示了不同模式下的光场分布及其受光纤参数影响的分析结果。
541 4
【光波电子学】基于MATLAB的多模光纤模场分布的仿真分析
|
存储 小程序 前端开发
微信小程序健康管理系统的开发与实现(一)
微信小程序健康管理系统的开发与实现
594 0
|
Dart 前端开发 Android开发
【Flutter前端技术开发专栏】Flutter中的平台特定代码实现
【4月更文挑战第30天】Flutter旨在实现跨平台移动应用开发,但有时需针对iOS或Android编写特定代码。平台通道是关键机制,允许Dart代码与原生代码交互。通过`MethodChannel`等实现跨平台通信,然后在iOS和Android上响应调用。条件编译则在编译时决定特定平台代码。本文展示了如何在Flutter中处理平台特定功能,包括示例代码和总结。
395 0
【Flutter前端技术开发专栏】Flutter中的平台特定代码实现