SwiftLint 的安装与使用

SwiftLint 的安装与使用

SwiftLint

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

为什么需要Lint?

CodeReview

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

安装

全局安装

  • 全局安装非常简单,首先我们需要通过brew命令安装SwiftLint:
brew install swiftlint
  • 然后添加编译脚本:

  • 最后在黑框框中添加如下脚本:
if which swiftlint >/dev/null; then
swiftlint
#echo "skip"
else
echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi

  • 大功告成,就可以编译啦,之后每次安装只需要给工程添加脚本就可以了。

局部安装

  • 除了全局安装,我们也可以通过CocoaPods进行安装。在Podfile上添加相关的依赖:
pod 'SwiftLint'
  • 然后跟全局方法一样,在Run Script中添加命令,但是内容有些许的不同:
"${PODS_ROOT}/SwiftLint/swiftlint"

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

使用

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

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

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

\n \tab \n

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

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

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

swiftlint autocorrect

  • 然后我们就会发现,所有的空格符Warning都消失了。这都得益于我们刚刚所进行的命令行操作,它会将已知的能够自动修复的Error和Warning都自动修复,大大的减轻了我们的工作量。
  • 但是又出现了一个问题,在项目的根目录之下执行自动纠正,SwiftLint会将Pods文件夹中的Swift文件也一起纠正了,第三方的框架原则上能不动就不动,那么我们该怎么办呢?
  • 这个时候就需要.swiftlint.yml文件了。那么这是一个什么文件呢?在使用SwiftLint的时候,很多时候我们会碰到一些自定义的规则需求,这个时候就需要.swiftlint.yml来解决问题了。

.swiftlint.yml

  • 所谓的.swiftlint.yml其实就是SwiftLint的一个配置文件,我们可以通过这个配置文件来修改约束的规则,以此达到自定义的效果。一般的配置文件大概长这个样子:

disabled_rules:
 - trailing_whitespace
 - line_length
opt_in_rules:
 - explicit_init
 - private_outlet
 - number_separator
 - nimble_operator
 - force_unwrapping
 - prohibited_super_call
 - overridden_super_call
 - closure_end_indentation
 - redundant_nil_coalescing
 - operator_usage_whitespace
 - conditional_returns_on_newline
 - switch_case_on_newline
 - no_extension_access_modifier
 - multiline_parameters
 - closure_spacing
 - first_where
 - implicit_return
 - fatal_error_message
included:
    - T3Go/Classes/Riding
    - T3Go/Classes/SpecialCar
colon:
 severity: error
trailing_newline: error
identifier_name:
 min_length:
  error: 3
 excluded:
  - id
vertical_whitespace:
 severity: error
comma: error
mark: error
force_cast: error
force_try: error
opening_brace: error
void_return: error
statement_position:
 severity: error
leading_whitespace: error
weak_delegate: error
function_parameter_count:
 warning: 6
 error: 8
trailing_comma:
 severity: error
closing_brace: error
dynamic_inline: error
implicit_getter: error
legacy_constant: error
syntactic_sugar: error
shorthand_operator: error
control_statement: error
file_length:
 warning: 1000
 error: 1200
function_body_length:
  warning: 280
  error: 370
type_body_length:
 - 250
 - 370
empty_enum_arguments:
 severity: error
# legacy_constructor: error
trailing_semicolon: error
operator_whitespace:
 severity: error
valid_ibinspectable: error
redundant_void_return: error
return_arrow_whitespace: error
# unused_closure_parameter: error
closure_parameter_position: error
legacy_cggeometry_functions: error
redundant_string_enum_value: error
legacy_nsgeometry_functions: error
empty_parentheses_with_trailing_closure: error

  • 下面我们来认识一下主要的几个配置选项,在此之前我们先要了解一下SwiftLint中的一个概念rules,所谓的rules就是一个一个的风格规则,比如冒号的规则,空格符的规则,类型名的规则等等。截止目前,SwiftLint一共支持75种规则,如果你感兴趣,可以在Source/SwiftLintFramework/Rules 中看到所有规则的实现。或者你也可以在终端输入swiftlint rules来查看当前的规则信息
disabled_rules
disabled_rules: # 禁用指定的规则
  - file_length
  - ...
opt_in_rules
opt_in_rules: # 启用指定的规则
  - file_length
  - ...
whitelist_rules
whitelist_rules: # 规则的白名单,但是不能和上面两个规则一起使用

  - file_length 

  - ...
included
included: # 你所希望Lint检索的路径,SwiftLint会扫描该路径下的所有.swift后缀的文件
  - ../
excluded
excluded: # 你所希望不要检索的路径,SwiftLint会无视掉该路径下的文件
  - Pods
风格规则
  • 由于风格规则太多了,这里不一一列举,但是用法都是大致相同的
force_cast: [warning | error] 当出现强制类型转换的时候是提示Error还是Warning

type_body_length:
  - 300 # 当超过300行的时候飚黄
  - 400 # 当超过400行的时候飚红
注释控制
  • 还有一个场景,有的时候,我们并不想大范围的禁用掉一个规则,但是在某个文件中,我们必须要无视这条规则,那么我们应该怎么告诉SwiftLint来无视掉它呢?很简单,注释!比如如下情况:

  • 这个是系统给的代理方法啊,竟然还警告我方法名称过长!难道无视他?不行,强迫症患者忍受不了啊!
  • 于是我们可以这样:

  • 这样在 (//swiftlint:disable line_length) 注释之后的所有行长的警告都会被忽略掉。如果你想要在忽略掉这一行之后再次启用,那么只要再添加一行 (//swiftlint:enable line_length) 就可以了。

  • 如果你觉得,有很多的控制注释也看起来不顺眼的话,个人推荐可以这样,把它写在开头的注释上:

  • 或者更加的极端:

配置文件的嵌套
  • 值得一提的是,在我们使用配置文件的时候,SwiftLint会默认将所指定的文件目录递归的扫描下去的。如果扫描过程中,在子目录下发现了一个新的.swiftlint.yml文件,那么子目录下的规则就会改为新的配置规则。

自定义配置

创建配置文件

  • 首先需要在项目的根目录下新建一个名为 .swiftlint.yml 的配置文件
  • 打开终端, cd 到项目根目录下
  • 输入: touch .swiftlint.yml
  • 执行完该命令后, 在文件夹中你可能找不到该yml格式文件,那是因为文件被隐藏了
  • 关于隐藏/显示隐藏文件(命令一样): command + shift + .
  • 下面我们来认识一下主要的几个配置选项
disabled_rules: # 禁用指定的规则
  - colon
  - comma
  - control_statement
opt_in_rules: # 启用指定的规则
  - empty_count
  - missing_docs
  # 可以通过执行如下指令来查找所有可用的规则:
  # swiftlint rules
included: # 执行 linting 时包含的路径。如果出现这个 `--path` 会被忽略。
  - Source
excluded: # 执行 linting 时忽略的路径。 优先级比 `included` 更高。
  - Carthage
  - Pods
  - Source/ExcludedFolder
  - Source/ExcludedFile.swift

在代码中关闭某个规则

  • 可以通过在一个源文件中定义一个如下格式的注释来关闭某个规则:

// swiftlint:disable <rule>

  • 在该文件结束之前或者在定义如下格式的匹配注释之前,这条规则都会被禁用:

// swiftlint:enable <rule>

  • 例如:
// swiftlint:disable opening_brace
    func initTakeScreenshot(launchOptions: [AnyHashable: Any]?){
        // swiftlint:enable opening_brace
        if let options = launchOptions {
            let userInfo = options[UIApplicationLaunchOptionsKey.remoteNotification]
            NotificationCenter.default.post(name: Notification.Name.UIApplicationUserDidTakeScreenshot, object: userInfo)
        }
    }
  • 也可以通过添加 :previous, :this 或者 :next 来使关闭或者打开某条规则的命令分别应用于前一行,当前或者后一行代码。
// 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

忽略引入的第三方库

  • 忽略CocoaPods导入的第三方库
excluded: 
  - Pods
  • excluded 配置项用来设置忽略代码规范检查的路径,可以指定整个文件夹
  • 比如如果你的项目使用 Carthage 管理第三方库的话,可以将 Carthage 目录添加到忽略列表:
excluded: 
  - Pods
  - Carthage
  • 指定精确路径下的文件,通过 - xxxx 的形式列在下面就可以了
excluded: # 执行 linting 时忽略的路径。 优先级比 `included` 更高。
  - Source/ExcludedFolder
  - Source/ExcludedFile.swift

官方示例代码

disabled_rules: # 执行时排除掉的规则
  - colon
  - comma
  - control_statement
opt_in_rules: # 一些规则仅仅是可选的
  - empty_count
  - missing_docs
  # 可以通过执行如下指令来查找所有可用的规则:
  # swiftlint rules
included: # 执行 linting 时包含的路径。如果出现这个 `--path` 会被忽略。
  - Source
excluded: # 执行 linting 时忽略的路径。 优先级比 `included` 更高。
  - Carthage
  - Pods
  - Source/ExcludedFolder
  - Source/ExcludedFile.swift

# 可配置的规则可以通过这个配置文件来自定义
# 二进制规则可以设置他们的严格程度
force_cast: warning # 隐式
force_try:
  severity: warning # 显式
# 同时有警告和错误等级的规则,可以只设置它的警告等级
# 隐式
line_length: 110
# 可以通过一个数组同时进行隐式设置
type_body_length:
  - 300 # warning
  - 400 # error
# 或者也可以同时进行显式设置
file_length:
  warning: 500
  error: 1200
# 命名规则可以设置最小长度和最大程度的警告/错误
# 此外它们也可以设置排除在外的名字
type_name:
  min_length: 4 # 只是警告
  max_length: # 警告和错误
    warning: 40
    error: 50
  excluded: iPhone # 排除某个名字
variable_name:
  min_length: # 只有最小长度
    error: 4 # 只有错误
  excluded: # 排除某些名字
    - id
    - URL
    - GlobalAPIKey
reporter: "xcode" # 报告类型 (xcode, json, csv, checkstyle)

踩坑

建议

  • 注释控制在实际的使用中非常的常用,所以强烈建议使用代码块来简化操作:

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值