哈勃! 我叫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 { }
下一点是必需的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与自定义规则一起使用,请告诉我们有关它们-我将很高兴讨论可能的情况。