swiftlint使用指南

1.swiftlint简介

SwiftLintRealm 推出的一款 Swift 代码规范检查工具(Realm推出过一款跨平台的移动端数据库)。
SwiftLint 基于 Github 公布的 Swift 代码规范进行代码检查,并且能够很好的和 Xcode 整合。配置好所有的设置之后,在 Xcode 中执行编译时,SwiftLint 会自动运行检查,不符合规范的代码会通过警告或者 error 的形式指示出来,并且拥有丰富的配置项,可以进行大量的自定义,相当方便。

2.swiftlint安装

SwiftLint 有多种不同的安装方式,可以根据自己的喜好选择。

2.1使用 Homebrew 安装

Homebrew 是 macOS 自带的包管理工具,使用这种方式安装也是最简单的:

brew install swiftlint

如果swiftlint版本较低,可以升级(命令:brew upgrade swiftlint)

2.2使用 CocoaPods 安装

通过 CocoaPods 安装同样很简单,只需要在 Podfile 中添加依赖:

pod 'SwiftLint'

之后执行 pod install 就可以自动安装了,这种方式会将 SwiftLint 安装到项目的 Pods/ 目录下。如果你想要针对不同的项目使用不同的 SwiftLint 版本,这是一种很好的解决方案(Homebrew 会自动安装最新版本)。

需要注意的是使用这种方案会将整个 ** SwiftLint** 以及他的依赖包的完整资源文件都安装到 Pods/ 目录中去,所以在使用版本管理工具比如 git 时要注意设置忽略相关目录。

2.3使用安装包

SwiftLint 还支持使用 pkg 安装包进行安装,在官方的 Github 页面可以找到最新发布的安装包

2.4编译源代码

SwiftLint 完全使用 Swift 开发,并且它是基于 MIT License 开源的,所以你可以下载它的源代码,然后通过以下命令编译安装:

git submodule update --init --recursive; make install
2.5安装完成

等待安装完成,输入 swiftlint help 可以查看所有可用的命令:

➜  ~ swiftlint help
Available commands:

   autocorrect   Automatically correct warnings and errors
   help          Display general or command-specific help
   lint          Print lint warnings and errors (default command)
   rules         Display the list of rules and their identifiers
   version       Display the current version of SwiftLint

到此 SwiftLint 就安装完成了

3.配置 Xcode

接下来需要在工程中配置相关编译选项,才能使 SwiftLint 在 Xcode 中运行起来。配置也很简单,只需要在 Xcode 的 Build Phases 中新建一个 Run Script Phase 配置项,在里面添加如下代码:

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

如图所示:
[图片上传失败...(image-933261-1580636760609)]

如果是通过 CocoaPods 安装的 SwiftLint ,脚本替换为 CocoaPods 中的路径:

"${PODS_ROOT}/SwiftLint/swiftlint"

这里其实是设置了一个自动编译脚本,每次运行编译都会自动执行这个脚本,如果正确安装了 SwiftLint,就会执行 SwiftLint 中的代码规范检查,如果没有安装,脚本会抛出一个没有安装 SwiftLint 并提示下载的警告,方便提醒团队团队中没有安装的成员。
当然,你也可以设置为强制要求安装,这时如果没有安装则无法通过编译。只需要在脚本中 echo "warning: ..." 之后添加一行代码:exit 1,这样一来,如果没有安装 SwiftLint,编译时会直接抛出一个编译错误而非警告,提示需要安装 SwiftLint
到此配置就完成了,可以通过command+B/R来自动检查代码规范了(此时是默认代码的规则)。

4.swiftlint规则

前面集成了swiftlint之后,那么我们如何在项目中对我们的代码做自定义的代码规范检查呢?这里就需要创建代码规范的配置文件:.swiftlint.yml了。

4.1.配置.swiftlint.yml文件
  • 1>cd到主工程目录下,创建文件
touch .swiftlint.yml
  • 2>打开文件(Command+Shift+.可显示隐藏文件)并编辑,以下为本人编辑的规则文件仅供参考
excluded:
  - Pods
disabled_rules:
    - trailing_whitespace # 每一个空行不能有空格,会与Xcode换行后自动对齐生成的空格冲突,建议排除掉加。
    - missing_docs # 缺失说明注释, 官方解释:”Public declarations should be documented.”, 公共声明应该被注释/标记。 在函数声明的时候, 一般情况下, 带public关键字的函数的注释只能用 “///”和 “/* /”来注释, 如果不带public关键字的函数只能用 “//”和 “/* */” 。这个属性应该禁用,没必要!!!
    - function_parameter_count # 函数参数计数违例:函数应该有5个参数,多余会报错 函数参数个数, 函数参数数量(init方法除外)应该少点, 不要太多,swiftlint规定函数参数数量超过5个给warning, 超过8个直接报error。这个属性推荐使用, 由于简单就不举例了。注:function_parameter_count: error 这样并不能改变它的警告或错误,该属性不允许修改,但是可以禁用
    - identifier_name   #命名规则必须按照驼峰原则(可能model中的某些字段与json字段命名冲突,建议排除掉)
    - type_name #类型命名规则限制,以大写字母开头,且长度在1到20个字符之间
    - shorthand_operator #使用+= , -=, *=, /=  代替 a = a + 1
    - large_tuple #元祖成员 元组冲突:元组应该最多有2个成员,多余两个会报错
    - for_where #使用 `for where` 代替 简单的 `for { if }`
    - class_delegate_protocol #delegate protocol 应该被设定为 class-only,才能被弱引用
    - todo #避免 TODOs and FIXMEs 标识
cyclomatic_complexity: 20 #代码复杂度,默认为10
force_try: warning # try语句判断
force_cast: warning # 强制转换(代码中存在一些前面通过if判断过类型,后面做的强制转换的代码)
line_length:    #每行长度限制
  warning: 160
  error: 300
  ignores_function_declarations: true
  ignores_comments: true
file_length:    #文件长度
  warning: 1000
  error: 1500
function_body_length:   #函数体长度
  warning: 100
  error: 150
type_body_length:   #类的长度
  warning: 800
  error: 1200
  • 3>swiftlint.yml关键字说明
disabled_rules:禁用指定的规则
opt_in_rules:启动指定的规则
whitelist_rules:白名单规则,不能和上面两项混用
included:希望Lint检索的路径,SwiftLint会扫描该路径下的所有.swift后缀的文件
excluded: 希望不要检索的路径,SwiftLint会无视掉该路径下的文件,一般比如Pods、Carthage或者一些三方库
  • 4>swiftlint.yml配置文件的嵌套
    在我们使用.swift.yml配置文件的时候,如果在系统扫描的过程中发现了一个新的配置文件,那么子目录下的规则就会改为新的配置规则。

  • 5>代码中若要禁用规则,需要首先拿到某个规则的 ID。全局安装的 Swift Lint 可以在 Terminal 输入 swiftlint rules 查看所有可获得的规则以及对应的 ID;未全局安装的 Swift Lint 也可以直接在警告或错误提示末尾的小括号中找到其对应的 ID。
    在代码中即可使用以下注释禁用或开启相应的规则。

// 作用于该文件该行以下(除非遇到同一规则的 enable,disable)
// swiftlint:disable <rule1> [<rule2> <rule3>...]
// swiftlint:enable <rule1> [<rule2> <rule3>...]

// eg:
// swiftlint:disable trailing_whitespace vertical_whitespace
// swiftlint:enable trailing_whitespace

// 作用于下一(next),这一(this),上一(previous)行
// swiftlint:disable:next force_cast
let noWarning = NSNumber() as! Int
let hasWarning = NSNumber() as! Int
let noWarning2 = NSNumber() as! Int // swiftlint:disable:this force_cast
let noWarning3 = NSNumber() as! Int
// swiftlint:disable:previous force_cast
4.2.swiftlint默认规则介绍:

官方规则文档:https://realm.github.io/SwiftLint/
腾讯云翻译规则文档(推荐):
https://cloud.tencent.com/developer/article/1617958

4.3.swiftlint命令行介绍
  --version               查看版本号
  -h, --help              帮助

SUBCOMMANDS:
  analyze                 执行规则分析
  docs                    浏览器打开swiftlint规则官网
  generate-docs           为所有规则生成markdown文件
  lint (default)          打印警告和错误
  rules                   显示所有规则
  version                 显示版本号
  autocorrect             将已知的能够自动修复的Error和Warning都自动修复,一般旧的项目配置SwiftLint之后会出现大量的报错和警告,此命令可减少大部分工作量)

附参考:
SwiftLint GitHub地址:https://github.com/realm/SwiftLint

SwiftLint 官网说明.:https://realm.github.io/SwiftLint/index.html

swift代码规范工具:https://www.jianshu.com/p/eea2520f34ae

iOS- 工程配置SwiftLint:https://www.it610.com/article/1282270515729285120.htm

SwiftLint 规则:https://cloud.tencent.com/developer/article/1617958

https://www.jianshu.com/p/abb4057db849

https://www.jianshu.com/p/c8337160fcd4

http://www.cocoachina.com/articles/19415

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容