自定义SwiftLint规则

哈勃! 我叫Alex,我是FINCH的iOS开发人员。 新年快到了,开始改头换面的时候了,SwiftLint这样的酷东西将在此方面有所帮助。 在本文中,我将告诉您为什么必须在所有项目(包括旧项目和宠物项目)中实现它,并说明如何使用常规代码充分利用此工具。

我不会告诉您SwiftLint是什么以及如何安装-如果您不熟悉该工具,那么最好阅读官方文档

最好继续处理大型项目时出现的常见问题-以修补程序或其他方式为幌子不遵守样式指南。 但是实际上,即使您阅读了样式指南,甚至可以在极度陶醉的状态下称呼它们,也没有人保证不会出现平凡的错别字,尽管这并不意味着逻辑上的崩溃,但显然会影响美观。

因此,请记住:

1. SwiftLint允许您执行以下操作:

  • 一种风格与风格指南

其实一切。

文章可以在这里结束,但是如果是这样,我根本不会开始写这篇文章。 有趣的是,SwiftLint 不允许您这样做 -编写...修补程序代码。

2. SwiftLint允许您防止:

  • 强制展开
  • 强大的代表
  • 圈复杂度
  • 还有别的...

我认为避免此类错误很高兴,对吧? 这对于新手开发人员特别有用,因为他只学习并且有时不怀疑此类错误。

3. Swiftlint可以根据自己的规则进行扩展。

我将为不会成为其他父类的类指定final。 多亏了final,我们节省了项目的组装时间。 以下是Apple文档告诉我们有关最终课程的内容:
具有内部访问权限的声明(如果未声明任何内容,则为默认值)仅在声明它们的模块内可见。 由于Swift通常会分别编译组成模块的文件,因此编译器无法确定内部声明是否在其他文件中被覆盖。 但是,如果启用了“整体模块优化”,则将同时编译所有模块。 这允许编译器一起对整个模块进行推断,并在没有可见替代的情况下推断内部的final声明。

我们将通过一个简单的常规赛季来解决这种疏忽。 接下来,我将立即向ruby编写代码,以便您可以将代码直接嵌入到项目中:

final_class: included: ".*.swift" name: "Final class requrement" regex: '^class' message: "All classes must be final or nonfinal" saverity: error 

一个小而简单的例子。 我不会为每个规则写类似的东西,但是源代码将在本文的结尾。

 class SomeClass { } //  internal class SomeClass { } //  /* @non-final */ class SomeClass { } //   

下一点是必需的init。 我们公司不使用情节提要板,因此在每个UIView类中指定致命的初始化程序并非完全正常。 对于这种情况,我们有自己的NLView(NL-NibLess)-该类中所需的init仅实现一次。 项目的新开发人员可能不知道这一点,但是SwiftLint的利益总是被责骂而不是负责任的领导。 或与它。

 required_init: regex: 'required init\?\(coder: NSCoder\)' message: "Use NL class instead" 

如果您仍在使用情节提要,则可以使用以下规则来知道所有情节提要都是私有的:

 open_iboutlets: included: ".*.swift" name: "IBOutlet opening" regex: '@IBOutlet ?(weak){0,1} var' message: "IBOutlet should be private" severity: error 

 open_ibaction: included: ".*.swift" name: "IBAction opening" regex: '@IBAction func' message: "IBAction should be private" severity: error 

通常会在完全不必要的地方使用Foundation。 因此,最好每次都突出显示它,以免忘记:

  foundation_using: included: ".*.swift" regex: 'import Foundation' message: "Do you really need for Foundation ???" 

我希望每个人都知道打印是一个相当困难的操作,它会极大地损害应用程序的性能(尤其是循环)。 唯一的判决-印刷品根本不存在。

 print_using: regex: 'print' message: "Print decrease performance of the app" severity: error 

另外,您不应该创建仅类协议,因为这样的语法可能很快就会被弃用, 因此Swift开发人员不建议这样做

 class_protocol: regex: ': class' message: "Use Anyobject instead" 

以下是使用R.swift的项目的规则。

 image_name_initialization: included: ".*.swift" name: "Image initialization without R.swift" regex: 'UIImage\(named:[^)]+\)' message: "Use R.image.name() or typealias of this instead" severity: error 

这只是我能想到的一小部分,但是Internet上的例子却更少。 您可以在github上查看我的整个“集合”。

谢谢您的关注。 如果您还将SwiftLint与自定义规则一起使用,请告诉我们有关它们-我将很高兴讨论可能的情况。

Source: https://habr.com/ru/post/zh-CN481666/


All Articles