Swiftlint代码规范属性说明
来源:互联网 发布:Linux持续ping 编辑:程序博客网 时间:2024/05/07 23:05
SwiftLint代码规范属性详细说明
- 属性1 : weak_delegate 。 代理应该写成weak类型(弱代理)来避免循环引用
例如:
/// 1.1 编译通过class Langke { var chenlong: NSObjectProtocol?}/// 1.2 编译通过,但是触发swiftlint的 weak_delegate警告, 原因是变量名 myDelegate 中有 delegate 关键字,这属于名字滥用class Langke { var myDelegate: NSObjectProtocol?}/// 1.3 编译通过, 不会触发警告, 原因是在 var 关键字前面加了 weakclass Langke { weak var myDelegate: NSObjectProtocol?}/// 2.1 编译通过,但是触发 weak_delegate 警告,原因是 scrollDelegate 中 Delegate 放在了最后, 被理解成了代理class Langke { var scrollDelegate: UIScrollViewDelegate?}/// 2.2 编译通过, 既然变量名被理解成了代理, 那为了类似防止循环引用, 应该加关键字 weakclass Langke { weak var scrollDelegate: UIScrollViewDelegate?}/// 编译通过, 不会触发警告, 因为delegate放在了前面, 没有被理解成代理class Langke { var delegateScroll: UIScrollViewDelegate?}
总结, 如果要使用swiftlint中的这个 weak_delegate 属性, 当你所定义的变量名被理解成某某代理时, 则需要加关键字 weak 来消除warning, 最好的方式是别乱取名字, 比如这样取名也是错误的:var delegate: String?, 这也会trigger swiftlint warning!
- 属性2 : void_return 。 返回值为空,我们一般推荐用 ” -> Void “, 而不是 ” -> () “, 主要针对全局变量/常量闭包:如let xingYun: () -> () = {}
例如:
/// 触发void_return 和 属性46:redundant_void_returnfunc XingYun() -> () { print("星云摁羊不厉害!")}// 触发void_returnlet xingYun: () -> ()/// 不触发 void_return, 但是会触发属性46: redundant_void_returnfunc XingYun() -> Void { print("星云摁羊很厉害!")}// 不触发let xingYun: () -> Void
总结, 返回为空全部统一用关键字 Void, 不要用 ()
- 属性3 : vertical_whitespace 。 垂直方向上的空格行,限制为一行(注释除外),
例如:
/// 没有空格, nonTriggerWarningoverride func viewDidLoad() { super.viewDidLoad() let aaa = 0} /// 有一行空格, nonTriggerWarningoverride func viewDidLoad() { super.viewDidLoad() let aaa = 0 ............................1}/// >=2行,就会触发警告override func viewDidLoad() { super.viewDidLoad() let aaa = 0 .............................1 .............................2}
这个推荐到项目中,垂直方向行间数最多为1, 这样可以保证code的饱满性、可读性
- 属性4 : variable_name 。 变量名应该只包含字符数字字符, 并且只能以小写字母开头或者应该只包含大写字母。此外,当变量名被声明为static(静态)变量时或者immutable不可变的时候,这时或许可以以一个大写字母开头。最后,变量名不应该太长或者太短(应该在3-40个字符间,否则会触发警告!!!)。注意:目前变量名只适用于自己写的方法的参数和自己写的class中的全局常量或变量, 对于系统自带的方法里面和自己写的方法里面没有作用
例如:
本例来自于官方文档 nonTriggeringExamples: [ "let myLet = 0", "var myVar = 0", "private let _myLet = 0", "class Abc { static let MyLet = 0 }", "let URL: NSURL? = nil", "let XMLString: String? = nil" ], triggeringExamples: [ "↓let MyLet = 0", "↓let _myLet = 0", //这里我就郁闷了,这样命名不可以? "private ↓let myLet_ = 0", "↓let myExtremelyVeryVeryVeryVeryVeryVeryLongLet = 0", "↓var myExtremelyVeryVeryVeryVeryVeryVeryLongVar = 0", "private ↓let _myExtremelyVeryVeryVeryVeryVeryVeryLongLet = 0", "↓let i = 0", "↓var id = 0", "private ↓let _i = 0" ]
属性5 : valid_ibinspectable 。 @IBInspectable在swiftlint中的使用需要注意, 第一必须是变量, 第二必须要有指定的类型,如果指定的类型是可选类型或者隐式类型,则目前官方只支持以下几种类型:
String, NSString, UIColor, NSColor, UIImage, NSImage.
例如:
/// 指定为变量var, 类型为String?和String!@IBInspectable private var yyy: String?@IBInspectable private var zzz: String!/// 如果写成这样,编译能通过,但是会触发警告, 因为swiftlint暂不支持Int可选和隐式类型:@IBInspectable private var dddl: Int!@IBInspectable private var eeel: Int?/// 如果指定的类型不是可选类型, 就应该初始化,否则系统不允许,会报错所在的类没有初始化对:@IBInspectable private var counts: Int = 0系统报错:@IBInspectable private var counts: Int
- 属性6 : file_header 。文件头。文件应该有一致的注释, 主要看下面例子:
例如:
/// 不会触发warning如果我新建一个工程,在ViewController.swift文件中, 开始的注释应该是://// ViewController.swift// SwiftLint//// Created by langke on 17/1/17.// Copyright © 2017年 langke. All rights reserved.//改变一下变为://// MyViewController.swift...................由于这里和外面的文件名不一样,所以触发warning(实际上在swift 3.0上测试这个属性暂时没有任何作用!!)// SwiftLint//// Created by langke on 17/1/17.// Copyright © 2017年 langke. All rights reserved................官方terminal表示,Copyright和Created没有对齐,也会触发warning!!!//
- 属性7 : prohibited_super_call 。被禁止的父类响应。一些方法不应该响应父类。
例如:
/// 不会触发warning class VC: UIViewController { override func loadView() { } } class NSView { func updateLayer() { self.method1() } }/// 会触发warningclass VC: UIViewController { override func loadView() ↓{ super.loadView() }}class VC: NSFileProviderExtension { override func providePlaceholder(at url: URL, completionHandler: @escaping (Error?) -> Void) ↓{ self.method1() super.providePlaceholder(at:url, completionHandler: completionHandler) } }class VC: NSView { override func updateLayer() ↓{ self.method1() super.updateLayer() self.method2() } }
- 属性8 : colon 。冒号的使用, swiftlint的这个colon属性规则很简单,要求“ :”紧靠所定义的常量或变量等,必须没有空格,与所指定的类型之间必须只有一个空格,多一个或少一个都不行,如果是用在Dictionary中,则要求紧靠Key,与Value之间必须有且仅有一个空格。这个规则我觉得应该强制推荐使用。由于简单,就不举例子了。
- 属性9 : comma 。逗号规则, 冒号的使用可以使代码看起来不让人感到那么疲惫、头疼, 使用只要遵循“前不离身后退一步”就行了,这个也强制推荐使用。
属性10 : trailing_newline 。尾部新行,官方文档给出的description是:”Files should have single trailing newline”, 也就是说,文件(属性、方法)结束的的时候(“}”之前), 应该有一个空格新行,但这里要注意的是, 只是应该, 而不是必须, 所以这个属性也算是一个可选属性。官方给出的例子是这样的:
/// 空一行,不会触发警告nonTriggeringExamples: [ "let a = 0\n"],/// 下面会触发警告triggeringExamples: [ "let a = 0", /// 不空行,会触发警告(实际上,我试过,不会触发警告) "let a = 0\n\n" /// 空两行, 会触发警告(实际上,我试过,会触发警告,但是触发的是vertical_whitespace警告而不是trailing_newline)],/// 说说这里,它要求改正为都空一行,虽然这样code看起来很轻松,但如果定义变量或常量太多,就太分散了(值得说的是,就算不空行也不会触发trailing_newline, 应该刚才也已经说了,这个属性只是说“应该”,而不是必须)corrections: [ "let a = 0": "let a = 0\n", "let b = 0\n\n": "let b = 0\n", "let c = 0\n\n\n\n": "let c = 0\n"]
既然如此,那这个属性什么时候回触发,具体的触发是在哪个地方呢?我自己测试了一下,这个方法的触发是在当前所在类的页面中的闭包最外面的尾部,也就是在“ }”的后面有一个空格新行,或者没有空格新行,如果 >= 2 则就会触发trailing_newline警告,比如:
}..............第40行...............第41行空行...............第42行空行-------->触发警告
这个属性是swiftlint的一个随意的属性,如果对代码要求style特别严格的那就用一下吧,其他几乎没有什么影响。
- 属性11 : trailing_whitespace 。 尾部空白行,这个强烈不推荐使用。看下面例子:
例如:
/// 下面这个例子不会触发警告,但是一旦其中有一个空行就会触发警告trailing_whitespace, 这和vertical_whitespace实质上有些冲突,vertical_whitespace要求两行code之间不超过1行,要么没有空行,要么只有1行,而trailing_whitespace要求没有空行!!!class ViewController: UIViewController {override func viewDidLoad() { super.viewDidLoad() let a = 0 let b = 1 let c = 2}func chenlong() -> Void { let a = 0 print(a)}}
这个属性强烈不推荐,代码之间不允许有一个空行,这会使程序的可读性差,所以希望禁用!!!
属性12 : line_length 。行的字符长度属性。这个强烈不推荐使用。官方的规定是超过120字符就给warning, 超过200个字符就直接报error!!!我们又不是写底层脚本的,所以建议这种方式禁用!!
属性13 : mark 。 标记方法或者属性。这个推荐使用, 可以统一方法标记的格式, 有利于review查找某个方法或者属性的时候更清晰。使用也非常简单: “MARK”前空一格,”MARK:”后空一格。
属性14 :todo 。TODO 和 FIXME 应该避免使用, 使用“notaTODO 和 notaFIXME”代替。另外, 和 MARK 标记不同的是, “notaTODO 和 notaFIXME”没有空格要求,但是我建议如果要使用这个 todo 属性, 尽量写成和 MARK 一样的规范。
属性15 : trailing_comma 。尾部逗号, 这个强烈推荐使用, 这个属性主要针对数组和字典最后一个元素。
例如:
/// 数组这样写是没有任何问题的, 但是最后一个元素3后面加了一个逗号“,”尽管这样不会报错,但是这会让程序的可读性变差let ages = [1, 2, 3,]let person = ["XingYun": 98, "JinGang": 128, "LangKe": 18,]/// 使用swiftlint的trailing_comma规则后,就会报warning, 所以正确的写法不应该加上这个“,”let ages = [1, 2, 3]let person = ["XingYun": 98, "JinGang": 128, "LangKe": 18]
属性16 : trailing_semicolon 。末尾分号, 强烈推荐使用,尽管在变量或常量赋值之后加不加分号在swift中没有硬性的要求,但是为了使code style更swift化,所以尽量或者绝对不要加“;”。
属性17 : closing_brace 。封闭大括号, 大括号和括号中间不应该有任何的空格, 也就是 “{}”和“()”不能有空格, 这个属性推荐使用。
例如:
/// 没问题({})/// 有问题( {})/// 有问题({} )
- 属性18 : closure_end_indentation 。 闭包结束缩进, 什么意思呢?就是 大括号(一般是方法)上下对齐的问题,这样使code看起来更加整洁。
例如:
/// 必须注意的是,大括号左边“{”前面有一个空格,没有则会触发closure_end_indentation警告langke.beginFishing {......................}
- 属性19 : closure_spacing 。 闭包空格,闭包表达式在每个大括号内应该有一个单独的空格, 要注意的是这里指的是“应该”, 我自己测试了一下,在swift 3.0并没有报warning, 所以这也不是强制性要求,但这个推荐使用。
例如:
[].filter { content }
- 属性20 : closure_parameter_position 。 闭包参数位置, 闭包参数应该和大括号左边在同一行, 推荐使用。
例如:
/// number 和 { 在同一行let names = [1, 2, 3]names.forEach { (number) in print(number)}let names = [1, 2, 3]names.map { number in number + 1}/// 这样不行,违背 closure_parameter_position规则, 触发warninglet names = [1, 2, 3]names.forEach { (number) in print(number)} let names = [1, 2, 3] names.map { number in number + 1 }
属性21 : dynamic_inline 。动态–内联, 避免一起使用 dynamic 和 @inline(_ _always), 否则报 error
例如:
/// 正确的做法class LangKe {dynamic func myFunction() {}}class LangKe { @inline(__always) func myFunction() { }}class LangKe { @inline(never) dynamic func myFunction() { }}/// 只要同时使用 dynamic 和 @inline(_ _always)都报错 error!!!class LangKe { @inline(__always) public dynamic func myFunction() { }}
这个属性这样做我也不知道什么原因, dynamic 和 @inline(__always) 不能同时使用, 不过既然它这样做,那必然有着它的道理, 所以这个属性也推荐使用。
- 属性22 : unused_closure_parameter 。 不使用的闭包参数, swiftlint建议最好不使用的闭包参数使用 “_”代替。推荐使用。
例如:
/// 不会触发warning[1, 2].map { _ in return 3}/// 会触发warning[1, 2].map { number in return 3}
- 属性23 : compiler_protocol_init 。 编译器协议初始化, 属性在swiftlint的有着例子,但是我在swift 3.0中运行并没有起到任何作用, 所以这个属性是否需要使用待定。不过仔细在 terminal上使用 swiftlint rules 查看了一下,并没有发现compiler_protocol_init属性,也许是新加的属性,还没有集成到new version上?
例如官方的完整讲解是这样的:
public static let description = RuleDescription( identifier: "compiler_protocol_init", name: "Compiler Protocol Init", description: "The initializers declared in compiler protocols such as `ExpressibleByArrayLiteral` " + "shouldn't be called directly.", /// 不会触发警告 nonTriggeringExamples: [ "let set: Set<Int> = [1, 2]\n", "let set = Set(array)\n" ], /// 会触发warning(实际上我在swift 3.0中测试过,根本就不会触发swiftlint的warning) triggeringExamples: [ "let set = ↓Set(arrayLiteral: 1, 2)\n", "let set = ↓Set.init(arrayLiteral: 1, 2)\n" ])
- 属性24 : control_statement 。 控制语句, if、for、while、do语句不应该将 条件 写在 圆括号 中, 另外注意条件出的空格。
例如:
nonTriggeringExamples: [ "if condition {\n", "if (a, b) == (0, 1) {\n", "if (a || b) && (c || d) {\n", "if (min...max).contains(value) {\n", "if renderGif(data) {\n", "renderGif(data)\n", "for item in collection {\n", "for (key, value) in dictionary {\n", "for (index, value) in enumerate(array) {\n", "for var index = 0; index < 42; index++ {\n", "guard condition else {\n", "while condition {\n", "} while condition {\n", "do { ; } while condition {\n", "switch foo {\n" ], triggeringExamples: [ "↓if (condition) {\n", /// 有 “()”, warning "↓if(condition) {\n", /// if 和 条件之间没空格, 而且有 “()” "↓if ((a || b) && (c || d)) {\n", "↓if ((min...max).contains(value)) {\n", "↓for (item in collection) {\n", "↓for (var index = 0; index < 42; index++) {\n", "↓for(item in collection) {\n", "↓for(var index = 0; index < 42; index++) {\n", "↓guard (condition) else {\n", "↓while (condition) {\n", "↓while(condition) {\n", "} ↓while (condition) {\n", "} ↓while(condition) {\n", "do { ; } ↓while(condition) {\n", "do { ; } ↓while (condition) {\n", "↓switch (foo) {\n" ]
这个属性保证了代码的简洁性, 一般而言,在swift中的条件句中尽量不加括号, 直接写条件,除非特别需要! 另外注意条件前后的空格,一般都有一个空格,这个属性推荐使用。
属性25 : custom_rules 。 自定义规则。 这个属性可以通过提供正则表达式来创建自定义规则, 可选指定语法类型搭配, 安全、级别和要陈列的什么信息。 这个属性只要熟悉使用正则表达式的人使用,目前可以不适用。
属性26 : cyclomatic_complexity 。循环复杂度。函数体的复杂度应该要限制,这个属性主要约束条件句、循环句中的循环嵌套问题, 当嵌套太多的循环时,则会触发swiftlint中的warning和error,当达到10个循环嵌套时就会报warning,达到20个循环嵌套时就会报error,强烈推荐这个属性。嵌套太多,可读性差!
例如:
// warning or errorfunc LangKe() -> Void { if true { if false { guard true else { return } if false { ...............循环复杂 } } }}
- 属性27 : empty_count 。比起检查 count 是否为 0 , swiftlint上说更喜欢检测 “isEmpty”。
例如:
/// swiftlint不喜欢这样使用let number = "long"if number.characters.count == 0 { print("为空")} else { print("不为空")}/// swiftlint更喜欢这种正式风格if number.isEmpty { print("为空")} else { print("不为空")}
这个属性推荐使用, 尽管我在swift 3.0上测试并没有触发警告, 但是这是一个比较好的约束, 可以规范开发者对语法的使用, 同时更符合swift的风格。
- 属性28 : statement_position 。 陈述句位置, 这里主要指的是 else 和 catch 前面要加一个空格, 也不能大于1个空格, 否则就会触发警告。
例如:
/// 没有空格,触发warning let number = "long" if number.isEmpty { print("为空") }else {.............................注意这里 print("不为空") } /// 这里也会触发warning, 因为else if换行了 let number = "long" if number.isEmpty { print("为空") } else if number.contains("long") {............................注意这里 print("不为空") } else { print("s") } /// 正确的写法 let number = "long" if number.isEmpty { print("为空") } else { print("不为空") }
- 属性29 : opening_brace 。在声明的时候, 左大括号应该有一个空格,并且在同一行,推荐使用。
例如:
/// trigger warninglet number = "long"if number.isEmpty { print("为空")} else{............................注意这里 print("s")}/// nonTrigger warninglet number = "long"if number.isEmpty { print("为空")} else { print("s")}
当然,如果有小括号的时候, 就不要有空格, 比如:({ })——->这是属性 closing_brace的规则。
- 属性30 : empty_parameters 。为空参数。swiftlint更喜欢 “()->” 比起 “Void ->”
例如:
/// 01 不会触发warninglet abc: () -> Voidfunc foo(completion: () -> Void) {}/// 02 直接报错let bcd: Void -> Voidfunc foo(completion: Void -> Void) {}/// 03 在终端上查看swiftlint rules, 应该只会报warning, 但是直接报error, 然后系统提示 “02”应该改为:let bcd: (Void) -> Voidfunc foo(completion: (Void) -> Void) {}
- 属性31 : empty_parentheses_with_trailing_closure 。尾随闭包中使用空的圆括号, 在使用尾随闭包的时候, 应该尽量避免使用空的圆括号, 是否使用待定。
例如:
/// 触发warning [1, 2].map() { $0 + 1 } [1, 2].map( ) { $0 + 1 } [1, 2].map() { number in\n number + 1 \n} [1, 2].map( ) { number in\n number + 1 \n} /// 不会触发warning [1, 2].map { $0 + 1 } [1, 2].map { $0 + 1 } [1, 2].map { number in\n number + 1 \n} [1, 2].map { number in\n number + 1 \n}
属性32 : file_length 。 文件长度。 这个属性我在swift 3.0上测试并没有起到任何作用, 官方给的内容是:
identifier: "file_length",name: "File Line Length",description: "Files should not span too many lines.",nonTriggeringExamples: [ repeatElement("//\n", count: 400).joined()],triggeringExamples: [ repeatElement("//\n", count: 401).joined()]
属性33 : force_cast 。强制转换, 强制转换应该被避免,否则直接报 error。
例如:
/// 正确转换NSNumber() as? Int/// 直接报错, 不要强制转换NSNumber() as! Int
这个force_cast强制转换属性, 至于是否使用还有待商榷。
- 属性34 : force_try 。 强制尝试, swiftlint禁止使用强制尝试, 否则直接报 error。
例如:
/// 这样写是可以的,不会触发 errorfunc myFunction() throws {}do { try myFunction()} catch {}/// 这样直接触发 errorfunc myFunction() throws {}try! myFunction()
属性35 : function_body_length 。函数体长度, 函数体不应该跨越太多行, 超过40行给warning, 超过100行直接报错。推荐使用。
属性36 : function_parameter_count 。函数参数个数, 函数参数数量(init方法除外)应该少点, 不要太多,swiftlint规定函数参数数量超过5个给warning, 超过8个直接报error。这个属性推荐使用, 由于简单就不举例了。注:function_parameter_count: error 这样并不能改变它的警告或错误,该属性不允许修改,但是可以禁用
属性37 : imlicit_getter 。隐式getter方法。计算的只读属性应该避免使用 get 关键字, 也就是说, 如果只是为了只读, 那就可以直接返回就行, 而不用写 get 关键字, 如果既可读又可写,那就可以写。
例如:
/// 报warning
var foo: Int {
get{
return 20
}
}
/// 应该写成这样(直接写) var foo: Int { return 20 }
总结: 也就是说, 如果只有 get 一个关键字, 就不能写 get, 如果除 get关键字外,还有 set, 那就可以写 get , 再简化说:只读计算属性省略get, 可读可写不省略get, 当然, 这只针对 计算只读属性 的时候。
- 属性38 : legacy_cggeometry_functions 。遗留的CG几何函数, 当获取某个视图的宽、高、最小X、最大X值等等, swiftlint推荐使用swift的标准语法, 尽量不要使用从Objective-C中的遗留版本, 尽量语法swift化。
例如:
/// 这样不推荐使用CGRectGetWidth(someView.frame)/// 推荐使用下面的形式rect.widthrect.heightrect.minXrect.midXrect.................../// 我在swift 3.0, Xcode 8.1中作如下尝试, 编译直接失败,报错:CGRectGetMaxX has been replaced by property CGRect.maxXlet myLabel = UILabel(frame: CGRect(x: CGRectGetMaxX(myView.frame), y: 22, width: 33, height: 44))/// 根据**系统**提示信息改正如下let myLabel = UILabel(frame: CGRect(x: myView.frame.maxX, y: 22, width: 33, height: 44))
总结:swiftlint已经将这个属性紧靠系统原生API, OC带过来的CG几何函数很多已被弃用, 这个属性强烈推荐使用。
- 属性39 : legacy_constant 。遗留版本常数, 和属性38(legacy_cggeometry_functions)一样, 结构范围常数尽量分开、明确、具体, 不要使用OC的遗留整体常数。
例如:
/// 规范的写法,不会触发warningCGPoint.zero/// 不规范的写法, 会触发warningCGPointZeroCGRectZero
推荐使用这样的语法, 而且swift 3.0已经开始强制使用这种规范的点语法了。
- 属性40 : legacy_constructor 。遗留版本构造器, swiftlint要求系统自带构造器, 使用swift语法化, 不要使用OC版本的构造器。
例如:
/// swift语法, swift 3.0已经强制使用了,所以尽管swiftlint不定制这种规则, 系统也会强制规定使用CGPoint(x: 10, y: 20)/// 错误的构造器语法CGPointMake(10, 20)
- 属性41 : legacy_nsgeometry_functions 。 ns类几何函数, 和前面的几个属性一样, 使用swift点语法函数, 不使用以前的版本。
例如:
/// 正确view.width/height/minX/// 错误NSWidth(view.frame)
- 属性42 : operator_usage_whitespace 。操作符使用规则, 操作符两边应该有空格。比如 “+” “-” “??”
例如:
let sum = 1 + 2let mutiplier = 2 * 3let devide = 10 /2
- 属性43 : overridden_super_call 。 重写父类方法, 强烈推荐使用。
例如:
/// 正确的写法override func viewWillAppear(_ animated: Bool) { /// 注意重写父类方法 super.viewWillAppear(animated)}
*属性44 : private_outlet 。私人输出, IBOutlet 这个属性应该是私人的, 为了避免泄露UIKit到更高层, 官方:”IBOutlets should be private to avoid leaking UIKit to higher layers.”
例如:
/// swiftlint 建议当使用 IBOutlet属性的时候, 在其后面加一个 private 表示私有的, 但是我在swift 3.0上测试, 尽管使用了swiftlint, 但并没有起到任何作用// swiftlint建议不能下面这样写class LangKe { @IBOutlet var label: UILabel?}/// swiftlint 建议这样写class LangKe { @IBOutlet private var label: UILabel?}
- 属性45 : redundant_string_enum_value 。 多余的字符串枚举值, 在定义字符串枚举的时候, 不要让枚举值和枚举成员名相等
例如:
// warning 1enum Numbers: String { case one = "one" case two}enum Numbers: String { case one case two = "two"}enum Numbers: String { case one = "one" case two = "two"}
当然, 只要有一个case 的成员名和枚举值不相等, 那就没有warning, 比如:
enum Numbers: String { case one = "ONE" case two = "two"}
- 属性46 : redundant_void_return 。多余的返回值为空, 在函数声明的时候,返回值为空是多余的。定义常量或者变量的时候可以。
例如:
/// 这个属性要求这样写, 返回值为空省略func XingYun() { print("摁��")}/// 这个属性要求别这样写,否则会有warning(但是我在swift 3.0上测试并没有触发warning)func XingYun() -> Void { print("摁��")}注意: 在属性2中, void_return中, 喜欢 “-> Void”胜过于 “-> ()”, 这并不代表使用 -> Void 很好, 我觉得省略比较好, 所以这个属性推荐使用 。
- 属性47 : return_arrow_whitespace 。 返回箭头空格, swiftlint推荐返回箭头和返回类型应该被空格分开, 也就是 “->”和 type 之间有空格。
例如:
/// 报warningfunc XingYun() ->Int { print("摁牛") return 22}/// 不报warning ------> 推荐使用func XingYun() -> Int { print("摁牛") return 22}/// swiftlint 不反对“->”和“type”之间换行, 不报warning ------> 但是不推荐使用func XingYun() -> Int { print("摁牛") return 22}
属性48 : type_name 。类型名, 类型名应该只包含字母数字字符, 并且以大写字母开头,长度在3-40个字符。这个属性没什么好说的,强烈推荐使用。
属性49 : syntactic_sugar 。语法糖, swiftlint推荐使用速记语法糖, 例如 [Int] 代替 Array, 强烈建议推荐使用。
例如:
/// 触发warning let myArray: Array<Int> = [1, 2, 3] print(myArray) /// 正确写法,不会触发warning let myArray: [Int] = [1, 2, 3] print(myArray)
- 属性50 : switch_case_on_newline 。switch语句新行, 在switch语法里, case应该总是在一个新行上面。 看看例子就知道了。
例如:
/// swiftlint表示会触发warning switch type { case .value1: print("1")...................在同一行错 case .value2: print("2")...................在同一行错 default: print("3")...................在同一行错 } /// 不会触发warning switch type { case .value1: print("1") case .value2: print("2") default: print("3") }
总结来说,就是要求在switch语句中,case要求换行。这个属性强烈推荐使用。
- 属性51 : shorthand_operator 。速记操作符, 什么是速记操作符呢? 在swiftlint中, 就是我们常用的简洁操作运算符,比如:+= , -=, *=, /= 等等。在swiftlint中,在做一些赋值操作的时候,推荐使用简短操作符。
例如:
/// 不推荐使用(在swift 3.0上并不会触发warning或error) var value = 4 value = value / 2 print(value) /// 推荐使用 var value = 4 value /= 2 print(value)
- 属性52 : sorted_imports 。 分类/有序导入。 这个属性有些奇怪, 要求导入的时候导入的类要按顺序导入。另外,这个属性暂时在terminal上使用swiftlint rules是没有的。直接看官方给的示例:
例如:
identifier: "sorted_imports", name: "Sorted Imports", description: "Imports should be sorted.", nonTriggeringExamples: [ "import AAA\nimport BBB\nimport CCC\nimport DDD" ], triggeringExamples: [ "import AAA\nimport ZZZ\nimport ↓BBB\nimport CCC" ]
这个属性不推荐使用,导入的时候没必要按顺序来导入,一般来说,在项目中你也不会导入太多的类,特别是在swift语言中。
- 属性53 : number_separator 。数字分割线。当在大量的小数中, 应该使用下划线来作为千分位分割线。推荐使用。
例如:
/// 推荐使用这种形式 let xxx = 1_000_000_000.000_1 print(xxx) /// 不推荐使用这种形式(在swift 3.0上无warning,也就是说这个属性暂时并未起到任何作用) let xxx = 1000000000.0001 print(xxx)
- 属性54 : nimble_operator 。 敏捷操作符。和自由匹配函数相比, 更喜欢敏捷操作符, 比如:>=、 ==、 <=、 <等等。
例如:
/// 会触发warning(person.voice).toNot(equal("Hello world")) // 人的声音不等于“Hello world”10.to(beGreaterThan(5)) // 10比5大99.to(beLessThan(100)) // 99比100小// 改为以下(person.voice) != "Hello world" // 人的声音不等于“Hello world”10 > 5 // 10比5大99 < 100 // 99比100小
- 属性55 : nesting 。嵌套。类型嵌套至多一级结构, 函数语句嵌套至多五级结构。
例如:
/// no warningfunc langke() { func xingyun() { func caicai() { func xiaohui() { func jingang() { } } } } } /// trigger warning func langke() { func xingyun() { func caicai() { func xiaohui() { func jingang() { //开始触发警告 func beginTriggerWarning() { } } } } } }
- 属性56 : redundant_optional_initialization。 多余的可选初始化, 可选变量初始化为 nil 时是多余的,官方描述:description: “Initializing an optional variable with nil is redundant.”。
例如:
/// 触发warning(实际上在swift 3.0上并没有触发)var myVar: Int? = nilvar myVar: Optional<Int> = nilvar myVar: Int?=nilvar myVar: Optional<Int>=nil/// 正确的写法var myVar: Int? var myVar: Optional<Int> var myVar: Int?var myVar: Optional<Int>
这个属性可以使用,虽然暂时在terminal上没有,但后续应该会集成到相应的swiftlint环境中。
- 属性57 : leading_whitespace 。文件开始不应该有空格或者换行, 否则就会触发warning
例如:
/// 不会触发warning//// ViewController.swift// SwiftLint//// Created by langke on 17/1/12.// Copyright © 2017年 langke. All rights reserved.///// 会触发warning //..................................这里有一个空格// ViewController.swift// SwiftLint//// Created by langke on 17/1/12.// Copyright © 2017年 langke. All rights reserved.///// 会触发warning......................................这里是一个空行//// ViewController.swift// SwiftLint//// Created by langke on 17/1/12.// Copyright © 2017年 langke. All rights reserved.//
- 属性58 : vertical_parameter_alignment 。垂直方向上的参数对齐。当函数参数有多行的时候, 函数参数在垂直方向上应该对齐(参数换行的时候左边对齐)。这个属性在 terminal 上使用 swiftlint rules查看目前是没有的。
例如:
nonTriggeringExamples: [ func validateFunction(_ file: File, kind: SwiftDeclarationKind, dictionary: [String: SourceKitRepresentable]) { } func validateFunction(_ file: File, kind: SwiftDeclarationKind, dictionary: [String: SourceKitRepresentable]) -> [StyleViolation] func validateFunction(_ file: File, kind: SwiftDeclarationKind, dictionary: [String: SourceKitRepresentable]) -> [StyleViolation] func validateFunction( _ file: File, kind: SwiftDeclarationKind, dictionary: [String: SourceKitRepresentable]) -> [StyleViolation] func validateFunction(\n" + _ file: File, kind: SwiftDeclarationKind,\n" + dictionary: [String: SourceKitRepresentable] ) -> [StyleViolation]\n", ] triggeringExamples: [ func validateFunction(_ file: File, kind: SwiftDeclarationKind, dictionary: [String: SourceKitRepresentable]) { } func validateFunction(_ file: File, kind: SwiftDeclarationKind, dictionary: [String: SourceKitRepresentable]) { } func validateFunction(_ file: File, kind: SwiftDeclarationKind, dictionary: [String: SourceKitRepresentable]) { } ]
- 属性59 : conditional_returns_on_newline 。条件返回语句应该在新的一行。 当有条件返回的时候应该换行返回,而不是在同一行。这个属性强烈推荐。
例如:
/// swiftlint 不推荐的写法, 否则会触发warning(但是在swift 3.0上测试并不会触发任何warning)if true { return }guard true else { return }/// swiftlint 推荐的写法if true { return}guard true else { return }
- 属性60 : force_unwrapping 。 强制解包/拆包。我们知道,当一个类型是可选类型的时候,当我们获取值时,需要强制解包(也叫隐式解包), 通常我们是在一个变量或者所需要的常量、类型等后面加一个“ !”, 然而,swiftlint建议强制解包应该要避免, 否则将给予warning。
例如:
/// 将触发warningnavigationController!.pushViewController(myViewController, animated: true)let url = NSURL(string: "http://www.baidu.com")!print(url)return cell!/// 不会触发warningnavigationController?.pushViewController(myViewController, animated: true)
- 属性61 : explicit_init 。显式初始化。显式初始应该避免。
例如:
/// 使用显式初始化则触发warning(但实际上我在swift 3.0上测试并没有发现触发warning!!!)[88].flatMap{ String↓.init($0) }UITableView.init()///正确的写法[88].flatMap{ String($0) }UITableView()
- 属性62 : missing_docs 。缺失说明注释, 官方解释:”Public declarations should be documented.”, 公共声明应该被注释/标记。 在函数声明的时候, 一般情况下, 带public关键字的函数的注释只能用 “///”和 “/* /”来注释, 如果不带public关键字的函数只能用 “//”和 “/* */” 。这个属性应该禁用,没必要!!!
例如:
不会触发warning// public, documented using /// docs/// docspublic func langke() {}// public, documented using /** docs *//** docs */public func langke() {}// internal (implicit), undocumentedfunc langke() {}// internal (explicit) / private, undocumentedinternal/private func langke() {}1、协议成员被文件标记、注释, 但是继承的成员就不用/// docspublic protocol A { /// docs var b: Int { get }}/// docspublic struct C: A { public let b: Int}2、本地定义的父类成员被文件标记, 但是子类成员就不用/// docspublic class A { /// docs public func b() {}}/// docspublic class B: A { override public func b() {}}3、外部定义的父类成员被文件标记, 但是子类成员就不用import Foundation/// docspublic class B: NSObject { // no docs override public var description: String { fatalError() }}</br></br>会触发warning(实际上在swift 3.0目前并不会触发!!)// public , undocumentedpublic func langke() {}// public , undocumented// regular commentpublic func a() {}// public, undocumented/* regular comment */public func a() {} // protocol member and inherited member are both undocumented /// docs public protocol A { // no docs var b: Int { get } } /// docs public struct C: A { public let b: Int }
属性63 : valid_docs 。有效文件 。 文件声明应该有效 。这个属性和属性62有冲突, 而且重复, 官网文档写得有问题。另外在swift 3.0上测试并不会发生warning。暂时不举例,这个属性禁用!!!后期等官方完善之后再追加。
属性64 : type_body_length 。类型体长度。类型体长度不应该跨越太多行, 超过200行给warning,超过350行给error。一般是大括号或者括号内, 比如定义一个enum或struct。
例如:
class langke { 这里有201行,warning!!!}
- 属性65 : redundant_nil_coalescing 。多余的为空联合操作符。为空联合操作符用来判断左边是否为空,伴随nil的为空操作符在右边是多余的。
例如:
/// 触发warning var myVar: Int? = nil myVar↓ ?? nil var myVar: Int? = nil myVar↓??nil //不会触发warning var myVar: Int? myVar ?? 0 var myVar: Int? = nil let langke = myVar
- 属性66 : object_literal 。对象字面量, swiftlint表示比起图片和颜色初始化,更喜欢对象字面量。因为swift初始化可以用表情,图片,颜色等,这不符合项目中的一些习惯用法。目前在terminal上使用swiftlint rules查看并没有这个属性。那自然现在在swift 3.0上测试并没有起到任何作用。但是这个属性推荐使用。
例如:
/// 官方给出的例子, 非触发warning"let image = #imageLiteral(resourceName: \"image.jpg\")","let color = #colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)","let image = UIImage(named: aVariable)","let image = UIImage(named: \"interpolated \\(variable)\")","let color = UIColor(red: value, green: value, blue: value, alpha: 1)","let image = NSImage(named: aVariable)","let image = NSImage(named: \"interpolated \\(variable)\")","let color = NSColor(red: value, green: value, blue: value, alpha: 1)"
- 属性67 : private_unit_test 。私有的单元测试。被标记为private的单元测试不会被测试工具XCTest运行, 也就是说,被标记为private的单元测试会被静态跳过。
例如:
private ↓class FooTest: XCTestCase { ...............继承于测试用例类XCTestCase, 被标记为private,所以触发warning func test1() {} internal func test2() {} public func test3() {} private func test4() {}.......另外注意这里,上面既然不会通过,那显然这里也不会通过,根本不会走这个func } internal class FooTest: XCTestCase { ......开始通过测试,因为没有被标记为private func test1() {} internal func test2() {} public func test3() {} private ↓func test4() {}................不通过,因为被标记为private } public class FooTest: XCTestCase { ..........通过 func test1() {} internal func test2() {} public func test3() {} private ↓func test4() {}.................不通过,因为被标记成private } class FooTest: XCTestCase { ..........通过 func test1() {} internal func test2() {} public func test3() {} private ↓func test4() {}.................不通过,因为被标记成private }
- 属性68 : frist_where 。直接看下面官方解释和示例, 这个属性没有测试。
例如:
description: "Prefer using `.first(where:)` over `.filter { }.first` in collections.", nonTriggeringExamples: [ "kinds.filter(excludingKinds.contains).isEmpty && kinds.first == .identifier\n", "myList.first(where: { $0 % 2 == 0 })\n", "matchPattern(pattern).filter { $0.first == .identifier }\n" ], triggeringExamples: [ "↓myList.filter { $0 % 2 == 0 }.first\n", "↓myList.filter({ $0 % 2 == 0 }).first\n", "↓myList.map { $0 + 1 }.filter({ $0 % 2 == 0 }).first\n", "↓myList.map { $0 + 1 }.filter({ $0 % 2 == 0 }).first?.something()\n", "↓myList.filter(someFunction).first\n" ]
- 属性69 : operator_whitespace 。空格/空白操作符。当定义空格操作符的时候,被定义的名字或类型两边应该各有一个单行空格操作符。推荐使用。
例如:
// 触发警告class Something: Equatable {var text: String?// "=="和“(lhs: Something, rhs: Something)”之间应该有一个空格static func ==(lhs: Something, rhs: Something) -> Bool { return lhs.text == rhs.text}}
- 属性70 : overridden_super_call。一些复写方法应该总是调用父类
例如:
/// 这样会触发警告 class VCd: UIViewController { override func viewWillAppear(_ animated: Bool) { //没有调用父类 } } /// 不会触发警告 class VCd: UIViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) } }
持续更新中…..
- Swiftlint代码规范属性说明
- PHPDocumentor代码注释规范说明
- google java代码规范说明
- svg规范关于transform属性的说明
- PHPDocumentor的代码注释规范说明
- 团队开发之:代码规范说明
- 关于我上传的代码规范的说明
- verilog的代码约束规范的几个重点说明
- SwiftLint的安装和使用
- CSS属性的代码以及功能的说明
- 代码规范
- 代码规范
- 代码规范
- 代码规范
- 代码规范
- 代码规范
- 代码规范
- 代码规范
- Linux环境进程间通信(四)信号灯
- 从输入一个url后到页面加载完成都发生了什么
- density based clustering algorithm,
- 关于智能提示(intellisense)重复(aardio)
- 表格里全选按钮
- Swiftlint代码规范属性说明
- vb6工程属性是乱码
- Linux nc命令详解
- numpy.cov以及corrcoef
- 数据结构实验之二叉树二:遍历二叉树
- 【不全,仅参考】iOS开发数据库操作之SQLite及Mysql操作实例
- 详解log4j2(下) - Async/MongoDB/Flume Appender 按日志级别区分文件输出
- 简易的自定义录像机
- Linux环境进程间通信(五): 共享内存(上)