????隨著Swift的不斷更新與優(yōu)化浓瞪,iOSer逐漸向Swift這艘大船靠攏了煎娇。很多OCer(比如在下),也開始嘗試從OC轉(zhuǎn)向Swift開發(fā)了丹鸿。OC和Swift的變化并不是太大越走,學(xué)好了基礎(chǔ)的Swift語法,開始用OC的想法去開發(fā)Swift項目好像也沒什么大問題靠欢。直到有一天廊敌,朋友推薦了一個Swift開發(fā)規(guī)范框架SwiftLint,讓集成到項目中看看代碼規(guī)范情況门怪,從此一切都變了??骡澈。(如何集成到項目中就不贅述了,百度就可以了)掷空。
? ? ? ?當(dāng)我信心滿滿的command + B 的時候肋殴,沒有任何問題。兩秒鐘過去坦弟,小demo就編譯玩了疼电。好像也沒啥啊〖跏茫看來我的代碼還是滿規(guī)范的??蔽豺。嗯?拧粪。修陡。沧侥。。等等魄鸦,滿屏幕的提醒是咋回事我才一個小模塊的業(yè)務(wù)宴杀,150+的提醒???
? ? 不過旺罢,對于程序員來說,探索未知的事情一直是我們的愛好绢记。不要慌扁达,咱慢慢來??,咱一條一條的看,一條一條的解決蠢熄。最終肯定會有個好的結(jié)果的跪解。下次同樣的提醒也能避免了,對吧??签孔。好叉讥,廢話不多說(好像說的挺多的??),走起饥追。
? ? 首先图仓,從出現(xiàn)最多的提醒來開刀吧,槍打出頭鳥但绕,誰教你最活躍呢??透绩。(opening_brace)
從他的提示來看,是間隔的問題碳竟。把else 左右兩邊都空格一個文字的距離草丧,再編譯一下。果然沒問題了??莹桅。剩下的相同的問題昌执,咱也一起整一下,一通折騰之后诈泼,蹭蹭蹭懂拾,提醒少80。雖然還有一些铐达,但是解決了一半岖赋,還是蠻開心的,繼續(xù)加油瓮孙√贫希總的來說:Opening Brace Spacing Violation: Opening braces should be preceded by a single space and on the same line as the declaration.出現(xiàn)這個提醒选脊,一般就是你的符號周圍需要間隔開。這樣更符合swift的開發(fā)規(guī)范脸甘。
? ? 第二個問題就比較奇怪了恳啥,我只是拖拽xib約束到cell,為什么你也給我整一個呢??丹诀?
????仔細(xì)一看提示說 铆遭,推薦我們使用private來修飾我們的IBOutlets以防止內(nèi)存泄漏硝桩。好吧,聽你的疚脐,我用private亿柑。用private就會造成一個問題,你在控制器中就無法直接對IBOutlt對象賦值了棍弄,所以望薄,將數(shù)據(jù)源傳進(jìn)來復(fù)制渲染UI吧。果然呼畸,這樣一改痕支,提醒就沒了。perfect蛮原!總的來說:Private Outlets Violation: IBOutlets should be private to avoid leaking UIKit to higher layers.(privat...)?出現(xiàn)這個提醒卧须,一般就是你的IBOutlet需要用private修飾。
????第三個問題初看好像也沒啥不妥儒陨,正常定義一個閉包嘛花嘶,又有啥幺蛾子呢???
好吧蹦漠,你是大佬椭员,咱聽你的,咱試試??笛园。果然隘击,提示沒有了。又搞定一個研铆÷裢總的來說:Comma Spacing Violation: There should be no space before and one after any comma.(comma)出現(xiàn)這個提醒,一般就是你的逗號周圍沒有間隔棵红,代碼閱讀性需要提升凶赁,SwiftLint提醒你加個空格,是代碼更容易閱讀(不知道為啥逗號前面不能有間隔,后面必須有間隔才不會提醒??)哟冬。
? ? 第四個就看起來很明顯了楼熄,Unused Closure Parameter Violation: Unused parameter "error" in a closure should be replaced with _. 應(yīng)該就是我們的這個error閉包我們定義了,但是沒有使用它浩峡。
在我們的敷衍下可岂,這個提醒也沒了『苍郑總的來說:缕粹,Unused Closure Parameter Violation: Unused parameter "XXX" in a closure should be replaced with _.?出現(xiàn)這個提醒,一般就是你定義一個閉包纸淮,但是你沒有使用它平斩,你也可以像我一樣敷衍一下,或者換種姿勢咽块,不對绘面,方式。
如果有個對象是別人強制給你的侈沪,但是你可以不用揭璃,你就把他寫成 _ 吧⊥ぷ铮“_”是代表函數(shù)調(diào)用時瘦馍,可以忽略參數(shù)名稱。好的应役,這個問題也解決了情组,咱繼續(xù)下一個問題。
? ? 接下來的問題可能就簡單點了箩祥,找空格院崇。空格問題以前一直都沒怎么注意袍祖,這不底瓣,SwiftLint幫我們?nèi)页鰜砹恕<热凰颊页鰜砹嗣し海覀兙腿タ纯床⒓m正一下吧
try前面多了空格键耕,from后面少了空格寺滚。咱都處理一下。Bingo屈雄,這個提醒也沒了村视。所以,以后看到這個提醒:Operator Usage Whitespace Violation: Operators should be surrounded by a single whitespace when they are being used.(operator_usage_whitespace) 酒奶。你需要檢查一下你的代碼里面是否多了空格或者少了空格蚁孔,把他補上或者刪掉就好了??
? ?????第五個問題奶赔, 作為Ocer,用杠氢;結(jié)尾不是必須的嘛??站刑。到了Swift自然免不了手滑也把他加上了。Swift已經(jīng)不需要我們來寫這個了鼻百,當(dāng)然你寫了也不會報錯绞旅,只會提示你:Trailing Semicolon Violation: Lines should not have trailing semicolons.(trailing_semicolon) 當(dāng)你下次看到這個,看看末尾是不是有温艇;因悲,把他去掉即可。
? ? ????第六個問題勺爱,使用Swift之后我們不再只能使用class定義model了晃琳,struct也能創(chuàng)建model了。如果只是值類型的model琐鲁,我們使用struct可能會更方便卫旱。好,咱就用一下绣否。當(dāng)我們滑溜的寫完誊涯,提醒也來了。
總的來說:下次看到這個提醒?Colon Violation: Colons should be next to the identifier when specifying a type and next to the key in dictionary literals.(colon) 看看是不是你的引號前面空格了暴构,把空格去掉就好了,后面沒有空格也會有這個問題的,加上空格就好了段磨。使用JsonExpert導(dǎo)出的model取逾,普遍存在這個問題,大家稍微改一下就好了??苹支。
? ? 第七個問題砾隅,是Swift的特性造成的,Swift的switch默認(rèn)在case技術(shù)的時候幫我們添加了break债蜜,我們不需要再手動添加break了晴埂。
所以,當(dāng)我們看到?Unneeded Break in Switch Violation: Avoid using unneeded break statements.(unneeded_break_in_switch) 就說明我們添加了不必要的break寻定,我們?nèi)サ羲秃昧恕?/p>
? ? 折騰了這么久儒洛,不知不覺中提醒已經(jīng)消除一大部分了。
? ? ? ?既然提醒還有狼速,那咱就繼續(xù)吧琅锻。看看還有哪些在等著我們。
? ? 第八個問題:for where 的使用恼蓬。以前遍歷經(jīng)常使用? for in 惊完,比如下面這種
原來是Swift推薦我們使用 for in where來替代for in 里面再添加條件判斷的,以前我們可能會在for in里面添加多種條件判斷处硬,但是代碼層層嵌套小槐,閱讀和使用都更方便。當(dāng)然filter函數(shù)也能達(dá)到目的郁油,大家也可以自己嘗試一下本股。所以,當(dāng)大家看到?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)拄显。這個從字面的意思來看應(yīng)該是集合不應(yīng)該有尾隨逗號,不應(yīng)該有案站,那我們?nèi)サ艟秃昧恕?/p>
? ? 第十個問題:這也是一個OC慣性思維造成的問題躬审。一般我們創(chuàng)建對象都是通過alloc init的方式去創(chuàng)建,swift幫我們省了一步蟆盐,我們不用再去寫alloc了承边。所以就有了如下的操作
仔細(xì)一看也沒啥問題,后來朋友告訴我石挂,現(xiàn)在不需要顯式創(chuàng)建對象了博助。直接去掉.init就好了。果然痹愚,去掉init就好了
以后我們在創(chuàng)建的對象可以不用調(diào)用init富岳,直接隱式創(chuàng)建就好了。所以當(dāng)你遇到?Explicit Init Violation: Explicitly calling .init()should be avoided.(explicit_init) ,不妨檢查一下你創(chuàng)建對象的方式,然后按照我的方式去解決它??。
? ? 第十一個問題:也是Swift語言和OC的差異問題刘陶。
所以,當(dāng)看到 Control Statement Violation: `if`,`for`,`guard`,`switch`,`while`,and `catch` statements shouldn't unnecessarily wrap their conditionals or arguments in parentheses.(control_statement) 你看看你的條件判斷語句是不是寫了多余的 () 萝喘,去掉它就好了。
? ? ? ?以上就是這次demo遇到的提醒和解決辦法琼懊。希望能給看到文章的你有些幫助??阁簸。