随着Swift的不断更新与优化,iOSer逐渐向Swift这艘大船靠拢了。很多OCer(比如在下),也开始尝试从OC转向Swift开发了。OC和Swift的变化并不是太大,学好了基础的Swift语法,开始用OC的想法去开发Swift项目好像也没什么大问题。直到有一天,朋友推荐了一个Swift开发规范框架SwiftLint,让集成到项目中看看代码规范情况,从此一切都变了😂。(如何集成到项目中就不赘述了,百度就可以了)。
当我信心满满的command + B 的时候,没有任何问题。两秒钟过去,小demo就编译玩了。好像也没啥啊。看来我的代码还是满规范的😊。嗯?。。。。等等,满屏幕的提醒是咋回事我才一个小模块的业务,150+的提醒😂?
不过,对于程序员来说,探索未知的事情一直是我们的爱好。不要慌,咱慢慢来😀,咱一条一条的看,一条一条的解决。最终肯定会有个好的结果的。下次同样的提醒也能避免了,对吧😕。好,废话不多说(好像说的挺多的😂),走起。
首先,从出现最多的提醒来开刀吧,枪打出头鸟,谁教你最活跃呢😝。(opening_brace)
从他的提示来看,是间隔的问题。把else 左右两边都空格一个文字的距离,再编译一下。果然没问题了😀。剩下的相同的问题,咱也一起整一下,一通折腾之后,蹭蹭蹭,提醒少80。虽然还有一些,但是解决了一半,还是蛮开心的,继续加油。总的来说:Opening Brace Spacing Violation: Opening braces should be preceded by a single space and on the same line as the declaration.出现这个提醒,一般就是你的符号周围需要间隔开。这样更符合swift的开发规范。
第二个问题就比较奇怪了,我只是拖拽xib约束到cell,为什么你也给我整一个呢😳?
仔细一看提示说 ,推荐我们使用private来修饰我们的IBOutlets以防止内存泄漏。好吧,听你的,我用private。用private就会造成一个问题,你在控制器中就无法直接对IBOutlt对象赋值了,所以,将数据源传进来复制渲染UI吧。果然,这样一改,提醒就没了。perfect!总的来说:Private Outlets Violation: IBOutlets should be private to avoid leaking UIKit to higher layers.(privat...) 出现这个提醒,一般就是你的IBOutlet需要用private修饰。
第三个问题初看好像也没啥不妥,正常定义一个闭包嘛,又有啥幺蛾子呢🤔?
好吧,你是大佬,咱听你的,咱试试😜。果然,提示没有了。又搞定一个。总的来说:Comma Spacing Violation: There should be no space before and one after any comma.(comma)出现这个提醒,一般就是你的逗号周围没有间隔,代码阅读性需要提升,SwiftLint提醒你加个空格,是代码更容易阅读(不知道为啥逗号前面不能有间隔,后面必须有间隔才不会提醒😢)。
第四个就看起来很明显了,Unused Closure Parameter Violation: Unused parameter "error" in a closure should be replaced with _. 应该就是我们的这个error闭包我们定义了,但是没有使用它。
在我们的敷衍下,这个提醒也没了。总的来说:,Unused Closure Parameter Violation: Unused parameter "XXX" in a closure should be replaced with _. 出现这个提醒,一般就是你定义一个闭包,但是你没有使用它,你也可以像我一样敷衍一下,或者换种姿势,不对,方式。
如果有个对象是别人强制给你的,但是你可以不用,你就把他写成 _ 吧。“_”是代表函数调用时,可以忽略参数名称。好的,这个问题也解决了,咱继续下一个问题。
接下来的问题可能就简单点了,找空格。空格问题以前一直都没怎么注意,这不,SwiftLint帮我们全找出来了。既然他都找出来了,我们就去看看并纠正一下吧
try前面多了空格,from后面少了空格。咱都处理一下。Bingo,这个提醒也没了。所以,以后看到这个提醒:Operator Usage Whitespace Violation: Operators should be surrounded by a single whitespace when they are being used.(operator_usage_whitespace) 。你需要检查一下你的代码里面是否多了空格或者少了空格,把他补上或者删掉就好了😀
第五个问题, 作为Ocer,用;结尾不是必须的嘛🤔。到了Swift自然免不了手滑也把他加上了。Swift已经不需要我们来写这个了,当然你写了也不会报错,只会提示你:Trailing Semicolon Violation: Lines should not have trailing semicolons.(trailing_semicolon) 当你下次看到这个,看看末尾是不是有;,把他去掉即可。
第六个问题,使用Swift之后我们不再只能使用class定义model了,struct也能创建model了。如果只是值类型的model,我们使用struct可能会更方便。好,咱就用一下。当我们滑溜的写完,提醒也来了。
总的来说:下次看到这个提醒 Colon Violation: Colons should be next to the identifier when specifying a type and next to the key in dictionary literals.(colon) 看看是不是你的引号前面空格了,把空格去掉就好了,后面没有空格也会有这个问题的,加上空格就好了。使用JsonExpert导出的model,普遍存在这个问题,大家稍微改一下就好了😀。
第七个问题,是Swift的特性造成的,Swift的switch默认在case技术的时候帮我们添加了break,我们不需要再手动添加break了。
所以,当我们看到 Unneeded Break in Switch Violation: Avoid using unneeded break statements.(unneeded_break_in_switch) 就说明我们添加了不必要的break,我们去掉它就好了。
折腾了这么久,不知不觉中提醒已经消除一大部分了。
既然提醒还有,那咱就继续吧。看看还有哪些在等着我们。
第八个问题:for where 的使用。以前遍历经常使用 for in ,比如下面这种
原来是Swift推荐我们使用 for in where来替代for in 里面再添加条件判断的,以前我们可能会在for in里面添加多种条件判断,但是代码层层嵌套,阅读和使用都更方便。当然filter函数也能达到目的,大家也可以自己尝试一下。所以,当大家看到 For Where Violation: `where` clauses are preferred over a single `if` inside a `for`.(for_where) 。这个是提醒大家遍历的时候可以把约束条件放在for in 后面
第九个问题:Trailing Comma Violation: Collection literals should not have trailing commas.(trailing_comma)。这个从字面的意思来看应该是集合不应该有尾随逗号,不应该有,那我们去掉就好了。
第十个问题:这也是一个OC惯性思维造成的问题。一般我们创建对象都是通过alloc init的方式去创建,swift帮我们省了一步,我们不用再去写alloc了。所以就有了如下的操作
仔细一看也没啥问题,后来朋友告诉我,现在不需要显式创建对象了。直接去掉.init就好了。果然,去掉init就好了
以后我们在创建的对象可以不用调用init,直接隐式创建就好了。所以当你遇到 Explicit Init Violation: Explicitly calling .init()should be avoided.(explicit_init) ,不妨检查一下你创建对象的方式,然后按照我的方式去解决它😀。
第十一个问题:也是Swift语言和OC的差异问题。
所以,当看到 Control Statement Violation: `if`,`for`,`guard`,`switch`,`while`,and `catch` statements shouldn't unnecessarily wrap their conditionals or arguments in parentheses.(control_statement) 你看看你的条件判断语句是不是写了多余的 () ,去掉它就好了。
以上就是这次demo遇到的提醒和解决办法。希望能给看到文章的你有些帮助😀。