使用Swift Format和Swift Lint保持干净的源代码


这是一篇文章,您可以使用代码格式化程序的SwiftFormat和代码检查:relaxed:SwiftLint轻松维护干净的Swift源代码。 SwiftFormatSwiftLint都是易于使用的工具,但是如果使用默认设置,可能会有很多:persevere:问题,因此,我将解释解决这些问题的设置。 :v:

出现的工具

  • SwiftFormat:一种自动格式化源代码的工具
  • SwiftLint:一种检查源代码的工具

试图通过利用这两个工具来有效地统一源代码的样式。

每个格式都很好的不同格式/样式的问题:fearful:

但是,由于这两个工具是由第三方而非Apple独立开发的,因此以下几点与默认设置不符。

  • Xcode生成的源代码格式
  • 由SwiftFormat格式化的格式
  • SwiftLint发出警告的条件

关于源代码的格式和样式,很难说哪个是正确的答案或出色的答案,但为了进行该项目,应将其统一为一个。在这里,由Xcode生成的代码样式是绝对的上帝的政策,我们将以尽可能与Xcode的格式/样式匹配的方式进行调整和设置。

使用Swift格式自动格式化代码

nicklockwood / SwiftFormat

安装

建议使用

CocoaPods安装。

1
pod 'SwiftFormat/CLI'

您可以使用

HomeBrew :beers:安装它,如果快速尝试它会更容易,但是如果您想通过稍后描述的方法"在构建/测试时自动格式化",

用x4>安装。 (因为您只需执行pod install就可以在任何构建环境中使用它)

如果使用

CocoaPods安装,则用于执行的二进制文件将安装在${PODS_ROOT}/SwiftFormat/CommandLineTool/swiftformat中。尝试运行SwiftFormat以查看它是否已安装并可以使用。

1
2
cd プロジェクトのルートディレクトリ
Pods/SwiftFormat/CommandLineTool/swiftformat --version

基本用法(从命令行尝试使用)

SwiftFormat中,如果指定在参数中包含源代码的目录或文件,则将根据规则格式化该目录/文件。

1
Pods/SwiftFormat/CommandLineTool/swiftformat SwiftFormatExp/AppDelegate.swift

AppDelegate.swift(格式化之前)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    private var someVar:String?=nil


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        self.someVar="abc"

        return true
    }
}

AppDelegate.swift(格式化后)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    private var someVar: String?

    func application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        someVar = "abc"

        return true
    }
}

在这种情况下,删除不必要的self.或在=之前和之后插入空格。通过以这种方式乘以SwiftFormat,可以消除符号的模糊。

但是,如果使用默认设置进行格式化(未指定选项),则Xcode生成或建议的代码也将被格式化,如上述示例中的application:didFinishLaunchingWithOptions:参数一样。 Xcode生成的代码与SwiftFormat的格式结果之间的差异在各个方面都造成了一点不便,因此Xcode生成的代码的策略绝对正确,并且,如果可能,Xcode指定匹配的选项您要生成的样式。

1
Pods/SwiftFormat/CommandLineTool/swiftformat SwiftFormatExp/AppDelegate.swift --trimwhitespace nonblank-lines --stripunusedargs closure-only --disable strongOutlets,trailingCommas

就我而言,我尝试指定这样的选项。

<表格>

选项

说明


<身体>

--trimwhitespace非空白行

防止空白行缩进

-stripunusedargs仅关闭

省略未使用的参数名称仅限于闭包

-禁用strongOutlets,尾随逗号

不要从outlets中删除weak,不要在数组元素的末尾添加逗号


如果指定这些选项并执行格式,将如下所示,并且方法的参数名称将正确保留。

AppDelegate.swift(可选版本)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    private var someVar: String?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        someVar = "abc"

        return true
    }
}

如果要适应整个

项目,请使用exclude选项排除诸如CarthageCocoaPods之类的外部库的源代码。

1
Pods/SwiftFormat/CommandLineTool/swiftformat . --exclude Carthage,Pods --trimwhitespace nonblank-lines --stripunusedargs closure-only --disable strongOutlets,trailingCommas

在构建/测试时自动格式化

您可以每次手动运行

代码格式,但是让我们创建一种机制来防止您意外忘记格式并提交到存储库。

以下时序可以视为自动运行代码格式的时序。

<表格>

时间

频率

处理时间

编辑舒适度(*)

防止应用遗漏

备注


<身体>

保存文件时

×

×

设置困难

构建源代码时

×

-

运行测试时

×

没有每次都运行测试的前提下就无法工作

即将提交(例如git的pre-commit钩子)

×

在检查格式化结果(包括源代码和构建结果)之前提交


*在Xcode的编辑器中反映出用SwiftFormat进行格式化的结果之前,存在一点时间差。如果同时编辑Xcode上的源代码,则会出现SwiftFormat上的格式结果冲突的问题。

每种都有优点和缺点,但是失去上面编辑器的舒适性是非常有压力的,因此,如果您是在执行测试的前提下进行开发的,建议您在格式化时进行格式化测试执行。

New Run Script Phase添加到项目的测试目标的Build Phases中。

スクリーンショット 2018-04-29 17.50.33.png

在添加的脚本阶段中编写SwiftFormat命令。

1
"${PODS_ROOT}/SwiftFormat/CommandLineTool/swiftformat" . --exclude Carthage,Pods --trimwhitespace nonblank-lines --stripunusedargs closure-only --disable strongOutlets,trailingCommas

如果安装了

CocoaPods,则可以使用${PODS_ROOT}/SwiftFormat/CommandLineTool/swiftformat指定SwiftFormat的路径。移动您创建的阶段,使其在Compile Sources之前运行。

スクリーンショット 2018-04-29 17.49.27.png

完成此操作后,让我们在适当的源代码中使用不必要的缩进和空格来运行测试。如果在该时间格式化源代码,则SwiftFormat设置完成。

检查SwiftLint问题

领域/ SwiftLint

安装

这也可以与HomeBrew或CocoaPods一起安装,但是让我们与CocoaPodsSwiftFormat一起安装。

1
pod 'SwiftLint'

如果还与CocoaPods一起安装,则用于执行的二进制文件将安装在${PODS_ROOT}/SwiftLint/swiftlint中。尝试运行它以查看它是否已安装并可以使用。

1
2
cd プロジェクトのルートディレクトリ
Pods/SwiftLint/swiftlint version

基本用法(从命令行尝试使用)

SwiftLint的情况下,没有必要将目标文件/目录指定为参数,因为执行时基本上检查目录下的文件。

1
2
cd プロジェクトのルートディレクトリ
Pods/SwiftLint/swiftlint

执行时,将输出问题部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
Linting Swift files in current working directory
Linting 'AppDelegate.swift' (1/3)
Linting 'ViewController.swift' (2/3)
Linting 'SwiftFormatExpTests.swift' (3/3)
AppDelegate.swift:6: warning: Trailing Whitespace Violation: Lines should not have trailing whitespace. (trailing_whitespace)
AppDelegate.swift:8: warning: Trailing Whitespace Violation: Lines should not have trailing whitespace. (trailing_whitespace)
AppDelegate.swift:11: warning: Trailing Whitespace Violation: Lines should not have trailing whitespace. (trailing_whitespace)
AppDelegate.swift:9: warning: Line Length Violation: Line should be 120 characters or less: currently 144 characters (line_length)
ViewController.swift:16: warning: Trailing Whitespace Violation: Lines should not have trailing whitespace. (trailing_whitespace)
SwiftFormatExpTests.swift:16: warning: Trailing Whitespace Violation: Lines should not have trailing whitespace. (trailing_whitespace)
SwiftFormatExpTests.swift:21: warning: Trailing Whitespace Violation: Lines should not have trailing whitespace. (trailing_whitespace)
SwiftFormatExpTests.swift:26: warning: Trailing Whitespace Violation: Lines should not have trailing whitespace. (trailing_whitespace)
Done linting! Found 8 violations, 0 serious in 3 files.

在生成时检查

让我们在构建时在Xcode上自动运行此检查。

New Run Script Phase添加到项目的应用目标的构建阶段(请注意,这不是测试目标)。

スクリーンショット 2018-04-29 18.12.22.png

确保执行与

CocoaPods一起安装的SwiftLint命令。

1
"${PODS_ROOT}/SwiftLint/swiftlint"

スクリーンショット 2018-04-29 18.16.11.png

如果将每次构建和每次保存都设置为执行SwiftFormat,请安排SwiftLint,使其在SwiftFormat之后执行,以便检查格式化后的代码。

如果在此状态下使用Xcode进行构建,则SwiftLint的结果将显示为警告。

スクリーンショット 2018-04-29 18.18.45.png

调整设置

但是,如果这也是默认设置,则会警告Xcode生成的代码样式。在默认情况下会警告由Xcode生成的代码的设置中,每次Xcode生成代码时都要更改样式很麻烦,但是每次Xcode生成时都会生成警告,并且掩埋了其他警告。结果。

同样,由Xcode生成的代码的样式绝对是正确的,我们将设置一些规则来减轻不必要的警告。同时,在检查中排除了CarthagePods目录,这些目录包含您不想在警告出现时弄乱源代码的外部库。

SwiftLint中,如果将.swiftlint.yml文件放在项目根目录中并在其中写入规则,它将根据内容进行检查。

.swiftlint.yml

1
2
3
4
5
6
excluded:
- Carthage
- Pods
disabled_rules:
- line_length
- trailing_whitespace

上方的设置禁用trailing_whitespace以允许空行缩进,并且禁用line_length以禁用关于每行长度的警告。关于每行的字符数,可以指定更长的长度而不是使它无效。

.swiftlint.yml

1
2
3
4
5
6
excluded:
- Carthage
- Pods
disabled_rules:
- trailing_whitespace
line_length: 150

概括

借助

SwiftFormatSwiftLint进行快乐的Swift编码:ok_woman: