iOS swiftLint m1 安装+规则
m1安装
终端不使用Rosetta
brew install swiftlint
Cocapods 安装
pod 'SwiftLint'
打开项目xcode,新建两个脚本命令
这里分别复制
if which swiftlint >/dev/null; then
swiftlint
else
echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi
和
"${PODS_ROOT}/SwiftLint/swiftlint"
可以运行,但是全部的规则都用上了。
需要新建规则 .swiftlint.yml
在项目根目录和Profile 同级 终端敲touch .swiftlint.yml
这文件是隐藏的。command + shift + . 在更目录显示,可先复制
disabled_rules:
- colon
- comma
- control_statement
opt_in_rules:
- empty_count
- missing_docs
included:
excluded:
- Carthage
- Pods
force_cast: warning
force_try:
severity: warning
line_length: 110
type_body_length:
- 300
- 400
file_length:
warning: 500
error: 1200
type_name:
min_length: 4
max_length:
warning: 40
error: 50
excluded: iPhone
identifier_name:
min_length:
error: 4
excluded:
- id
- URL
- url
- GlobalAPIKey
reporter: "xcode"
第三方库的报错不管
excluded:
- Carthage
- Pods
重新编译规则
swiftlint autocorrect
常会犯错规则提示
https://realm.github.io/SwiftLint/rule-directory.html
class_delegate_protocol #protocol和delegate的命名区分
当协议 protocol 的命名为xxdelgate 一定要继承某protocol ,不是delegate 结尾不会报错
closing_brace #闭包间距
colon #名称间距 关于:
Colon Spacing Violation: Colons should be next to the identifier when specifying a type and next to the key in dictionary literals. (colon)
: 前不空格,后需要空一格
let swift: String?
comma #参数间距 关于,
, 号前不需要空格,后需要空一格
comment_spacing #注释
Comment Spacing Violation: Prefer at least one space after slashes for comments. (comment_spacing)
compiler_protocol_init #协议的init方法不推荐使用
有点反人类
computed_accessors_order #get set位置不能错
先get 后 set
control_statement #判断语句
判断语句 if , for , guard , switch , while , catch
判断语句最外层不需要添加()
custom_rules 添加新规则
custom_rules:
pirates_beat_ninjas:
name: "Pirates Beat Ninjas"
regex: "([nN]inja)"
match_kinds:
- comment
- identifier
message: "Pirates are better than ninjas."
severity: error
no_hiding_in_strings:
regex: "([nN]inja)"
match_kinds: string
实现
empty_count #判断数组的count == 0 用 isEmpty
现有问题是optional 的数组直接用 count == 0 就不需要isEmpty
cyclomatic_complexity #循环复杂性 判断条件未知(可以删掉吧)
(不清楚)判断里太多判断会报
missing_docs # 类名 扩展类不要用public、open
Missing Docs Violation: public declarations should be documented. (missing_docs)
deployment_target #iOS适用版本 iOS 7.1以下会报
discouraged_direct_init #类初始化要带参数,不能直接初始化,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F7WE3NbC-1650783909680)(/Users/jtg_0705/Library/Application Support/typora-user-images/截屏2022-03-24 下午4.13.56.png)]
duplicate_enum_cases #枚举成员变量名重名
duplicate_imports # 重复含有的import类型
duplicated_key_in_dictionary_literal # 字典含有相同成员变量名
dynamic_inline #动态内联,基本用不上
empty_enum_arguments #空枚举论点 基本用不上
Case 语句后的参数不加括号
case .参数+()
empty_enum_arguments #参数为void不需要写void ,Xcode自带判别
empty_parentheses_with_trailing_closure #带有尾随闭包
empty_parentheses_with_trailing_closure # 尾随闭包不用写()
file_length #代码行数
超过500行警告,超过1200行error
file_length:
warning: 500
error: 1200
for_where #使用语法糖 for where
警告语法
for user in users {
if user.id == 1 { return true }
}
force_cast #类型转换
不能强制类型转换
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1HcdW9ts-1650783909680)(/Users/jtg_0705/Library/Application Support/typora-user-images/截屏2022-03-24 下午5.08.22.png)]
force_try # 不建议强制 try!
function_body_length #函数最大占用
- 默认配置:warning:40,error:100 可以删除吧
function_parameter_count #函数的参数多少
- 参数的多少: warning: 5, error: 8
generic_type_name #泛型名称规范
不能使用_ 第一个字母为大写, 字数不超过20行
identifier_name # 参数命名规范
使用小驼峰, private标识的前面可带_ 其他均报error
implicit_getter #只有get不能return
include_language #敏感词汇 可删
inert_defer #defer放在函数底部,可删
is_disjoint #不相交函数。没用过
large_tuple # 元组尽量不要用(类型,类型)
leading_whitespace #缩进 建议不用
很恶心,下一行xcode自带缩进,然后就报警告了, control + i 就直接报错了
legacy_cggeometry_functions #遗留的CGRectGet
legacy_constant #遗留的 CGPointZero 已经遗弃
legacy_constructor # 遗弃的构造器
ps: CGSizeMake(10, 10) 部分Xcode也会报错
legacy_hashing #重写hash 用 hash(into: ) 代替 hashValue
项目里没用到
legacy_random #用 类型.random 代替arc4random
line_length #一行不能超过110个字
line_length: 110
部分delegate的api会超过110个 tableViewDelegate 的某些api会有, AppDelegate会有
mark # 规范 // mark: - 其余都不规范
multiple_closures_with_trailing_closure #多个参数为闭包,尾随闭包要带形参(重要)
nesting 不能有多层嵌套
func 不能超过4层,其他不能超过3层
no_fallthrough_only # switch fallthrough 用法 代替的break继续执行
no_space_in_method_call #函数不带空格
不允许 函数名+ 空格 + ()
notification_center_detachment #NotificationCenter删除自己的监听要在deinit执行
只有NotificationCenter.default.removeObserver(self) 才会触发
nsobject_prefer_isequal # NSObject子类应该实现isEqual而不是==
就是继承NSObject不能用 func ==() {}
opening_brace # {} 括号外除了func外都要空一格
operator_whitespace #运算符函数空格
看不懂 函数用< | > 这种类型命名很少见
orphaned_doc_comment # 注释代码规范,/// 下不应该有//
private_over_fileprivate #外部定义用private不用fileprivate
private_unit_test #单元测试不要用private
基本用不上
protocol_property_accessors_order # 和 computed_accessors_order 一样,get set位置不能错
reduce_boolean # 数组 reduce不使用bool,使用0 代替
redundant_discardable_let #未用到的参数把let去掉
let _ = foo() 改为 _ = foo()
redundant_objc_attribute #本身自带@objc 把@objc去掉
@IBInspectable
@IBAction
@GKInspectable
@NSManaged
@IBDesignable
redundant_optional_initialization # 冗余optional 值初始化
错误
var myIntValue: Int? = nil
var myOptionalInt: Optional<Int> = nil
redundant_set_access_control #冗余前缀,基本不会碰到
错误
private(set) private var foo: Int
redundant_string_enum_value #当字符串枚举值都等于名称报警告
private enum YourEnum: String {
case first = "first"
case second = "second"
case third = "three"
}
redundant_void_return # 冗余空返回
如果函数没有返回值不用写 -> Void
return_arrow_whitespace #函数返回没有空格或多了空格
Returning Whitespace Violation: Return arrow and return type should be separated by a single space or on a separate line. (return_arrow_whitespace)
self_in_property_initialization # 闭包参数 调用self要用lazy
shorthand_operator # 自增减乘除使用语法糖
statement_position #else 与 } 之间有一个空格
Statement Position Violation: Else and catch should be on the same line, one space after the previous declaration.
superfluous_disable_command # 当禁用规则不会在禁用区域触发违规时,SwiftLint“禁用”命令是多余的。如果您想记录命令,请使用“-”
switch_case_alignment # switch case 对齐缩进
switch case control + i 解决
syntactic_sugar #swift数组语法糖
不推荐使用
Array<String>
Dictionary<Int, String>
Optional<Int>
Swift.Array<String>
todo # 不推荐使用todo (感觉可删)
推荐使用
其余的不推荐
...
trailing_comma #尾随逗号
数组最后一个元素不加 ,
trailing_newline # 尾随换行符
xcode自带换行符?没碰过
trailing_semicolon #尾随分号 ;
Xcode 自己也会报错
trailing_semicolon #一行结束不要空格
type_body_length # 类行数大小 感觉都会超过
type_body_length:
- 300
- 400
type_name # 命名规范长度
type_name:
min_length: 4
max_length:
warning: 40
error: 50
excluded: iPhone
unneeded_break_in_switch # switch 语句不需要写break
unused_capture_list # 闭包里没有用到的引用
{ [weak self] in }
Xcode 自带了
unused_closure_parameter # 没有用到参数
没有用到用 _ 解决
unused_control_flow_label #看不懂 可能是语法本身就错
unused_enumerated
当不使用索引或项目时,可以删除.enumerated()
不知道怎么实现,如果报错删掉.enumerated()
unused_optional_binding # 使用 != nil || if let 代替 if let _ =
xcode 自带不能这样写了
guard (scene as? UIWindowScene) != nil else { return }
unused_setter_value #不使用setter值 自己set自己就不需要写
valid_ibinspectable # 不规范@IBInspectable
@IBInspectable 类型的view 给 xib使用可以动态更改某些属性,类似圆角设置
这些不规范看不懂,用到也少
vertical_parameter_alignment # 函数 参数换行对齐 (我觉得可以删)当参数太后就很麻烦
trailing_whitespace #一行后面不能有空格
vertical_whitespace #换行默认只允许1行
可以修改
vertical_whitespace:
warning: 2
void_return # 建议使用 -> Void 代替 -> () .
xctfail_message #XCTFail() 项目里没用到
|