跟着 SwiftLint 学习代码规范

关注我,每天分享一个关于 iOS 的新知识

前言

前面介绍了如何在项目中使用 SwiftLint,感兴趣可以先去读一下。

你应该在 iOS 项目中使用 SwiftLint

SwiftLint 发展到现在已经有超过 200 条规则,每条代码规范都有其考量之处,或因为美观、或因为性能、或因为安全,看完这些规则我觉得有很多是值得我们学习的,今天就来分享一些我认为比较好的代码规范。也可以作为日常 CodeReview 的规范。

1、colon

这个规则要求,声明的冒号左边没有空格,右边有一个空格。指定类型时,冒号应位于标识符旁边,如果在字典中使用应位于 key 旁边。

2、comma

这个规则要求,逗号前面不能有空格。

3、trailing_whitespace

每行结尾不能有不必要的空格或制表符。这有助于保持代码清洁和一致。

4、force_cast

不允许使用强制类型转换,不循序强制解包。这是因为强制解包可能会导致程序在运行时 crash。

5、force_try

不允许使用强制 try,和强制类型转换一样,强制尝试可能会导致运行时错误。

6、line_length

限制每一行代码字符的长度,默认情况下超过 120 个会报警告,超过 200 个会报错,可以通过配置文件来更改默认值。这有助于提高代码的可读性。

7、function_body_length

限制函数体的长度,默认情况下超过 50 个字符会报警告,超过 100 个会报错。过长的函数体通常很难理解和维护。

8、type_body_length

限制一个类的行数,默认情况下超过 250 行会报警告,超过 350 行报错。过长的类型体可能表示类型过于复杂,应该考虑进行拆分。

9、cyclomatic_complexity

限制函数体的行数,默认情况下一个函数超过 10 行会报警告,超过 20 行报错。函数体的行数过多通常意味着函数过于复杂,不容易理解,需要重构。

10、identifier_name

检查标识符名称的长度和格式,包括变量名、常量名、类名等,默认情况下,低于 3 个字符会报警告,低于 2 个字符会报错,高于 40 个字符报警告,高于 60 个字符会报错。

合适的命名规则可以提高代码的可读性和理解性。

11、implicit_getter

计算属性和下标应避免使用 get 关键字,如果属性只有 get 方法,没有 set 方法,那么这个 get 应该省略。这样可以提高代码的可读性。

12、large_tuple

限制元组的成员数量,默认情况下超过两个会报警告,超过三个会报错。过大的元组可能导致代码难以理解和维护,应该考虑转换成自定义结构体或者类。

13、nesting

限制类型、枚举和结构体的嵌套层次,我们都知道,在 swift 中类型的声明和函数的声明是可以嵌套的,但是当嵌套层级过深可能导致代码难以理解和维护。这个规则限制类型最多嵌套 1 级深度,函数嵌套最多 2 级深度。

14、private_outlet

从 XIB 拖出来的 IBOutlet 属性应该被标记为私有(private),以避免将 UIKit 泄漏到更高层,这个主要是提高代码的封装性。

15、redundant_optional_initialization

不必要的可选初始化应该被移除,比如 var str: String? = nil,这里的 str 默认值就是 nil,因此在初始化时应该删除 = nil。这可以防止代码的冗余。

16、redundant_nil_coalescing

检查是否存在不必要的 nil 合并操作。比如:

go 复制代码
var str: String?
print(str ?? nil)

str 的值本身可能就为 nil,所以 ?? nil 是没有意义的。移除冗余的 nil 合并可以提高代码的可读性。

17、switch_case_alignment

switchcase 应该保持对齐。这可以提高代码的可读性。

18、trailing_comma

应避免/强制使用数组和字典中的尾随逗号,在多行数组和字典字面量中,最后一个元素后面不应该有逗号。这是多余的。

19、unused_closure_parameter

闭包中未使用的参数应替换为下划线 _。这可以提高代码的可读性。

20、unused_import

未使用的 import 应该被移除。这可以避免不必要的依赖。

21、vertical_whitespace

检查是否存在过多的空白行,默认情况下只允许有一行空白行。过多的垂直空白一是没必要,二是会影响代码的可读性。

22、reduce_boolean

应该用 .allSatisfy() 函数代替 reduce(true),用 .contains() 代替 reduce(false),因为这样可读性好,并且执行效率高。

23、empty_count

判断数组或者字符串长度为 0 时,应该用 isEmpty 属性,而不是 .count == 0,这是因为 isEmpty 属性的实现性能更高,基本上是 O1,但是有些集合的 count 属性复杂度为 O(n)。而且 isEmpty 可读性也更好一些。

24、force_unwrapping

强制解包可能会在线上导致崩溃,平时写代码时应该禁止使用。

25、reduce_into

应该用 reduce(into:_:) 代替 reduce(_:_:) 考虑到 copy-on-write 的特性,reduce(into:_:) 函数的执行性能更高。

26、toggle_bool

操作 Bool 类型时,应该用 someBool.toggle() 代替 someBool = !someBool,前者更具可读性。

最后

SwiftLint 逐渐发展成了一个庞大的项目,规则也在随着 Swift 的进化而变更,其实今天列出来的是我日常印象比较深刻的,还有很多规则也非常有用,大家可以自行看文档摸索一下。

这里每天分享一个 iOS 的新知识,快来关注我吧

本文同步自微信公众号 "iOS新知",每天准时分享一个新知识,这里只是同步,想要及时学到就来关注我吧!

相关推荐
CocoaKier1 小时前
苹果商店下载链接如何获取
ios·apple
zhlx28354 小时前
【免越狱】iOS砸壳 可下载AppStore任意版本 旧版本IPA下载
macos·ios·cocoa
XZHOUMIN15 小时前
网易博客旧文----编译用于IOS的zlib版本
ios
关键帧Keyframe16 小时前
音视频面试题集锦第 15 期 | 编辑 SDK 架构 | 直播回声 | 播放器架构
音视频开发·视频编码·客户端
爱吃香菇的小白菜18 小时前
H5跳转App 判断App是否安装
前端·ios
二流小码农1 天前
鸿蒙开发:ForEach中为什么键值生成函数很重要
android·ios·harmonyos
hxx2211 天前
iOS swift开发--- 加载PDF文件并显示内容
ios·pdf·swift
B.-1 天前
在 Flutter 应用中调用后端接口的方法
android·flutter·http·ios·https
️ 邪神1 天前
【Android、IOS、Flutter、鸿蒙、ReactNative 】约束布局
android·flutter·ios·鸿蒙·reactnative
️ 邪神2 天前
【Android、IOS、Flutter、鸿蒙、ReactNative 】文本点击事件
flutter·ios·鸿蒙·reactnative·anroid