讓不懂程式設計的人愛上iPhone開發系列2 iOS12+Swift4.2版-Checklists-14
特別提示:文末有彩蛋喲!
說明:
本系列教程改編自 raywenderlich.com 中的iOS Apprentice系列,有需要的童鞋請移步到這裡購買英文版原教程: https:// store.raywenderlich.com /products/ios-apprentice
歡迎繼續我們的學習。
進一步優化程式碼
在學習更多知識之前,讓我們進一步優化現有的程式碼。
首先開啟ChecklistViewController.swift,然後更改configureCheckmark(for:at:) 方法的程式碼如下:
func configureCheckmark(for cell: UITableViewCell, with item: ChecklistItem){ if item.checked{ cell.accessoryType = .checkmark }else{ cell.accessoryType = .none } }
小練習:
仔細對比下修改後的程式碼和之前程式碼間的區別,看看哪些地⽅變了?為什麼?
回答:
之前我們的引數中有一個indexPath,但這裡變成了ChecklistItem。
實際上,iOS SDK中很多物件和方法的名稱都是⼜臭⼜長的,不過好處就是它們可以讓你更容易理解各自的作用。幸運的是,Xcode提供了⾃動補充的特性,所以你只需要⼿動敲幾個字元,就會⾃動向你提⽰剩下的部分,否則光敲程式碼就得讓你頭大了
為什麼要修改這個⽅法呢? 之前的⽅法接收一個indexpath引數,然後用它來找到所對應的ChecklistItem
let item = items[indexPath.row]
但⽆無論在cellForRowAt和didSelectRowAt中,我們都已經做了同樣的事情。為 了避免重複工作,我們可以考慮直接將ChecklistItem物件作為⼀個引數來傳遞。
接下來讓我們新增一個新的方法:
func configureText(for cell: UITableViewCell, with item: ChecklistItem){ let label = cell.viewWithTag(1000) as UILabel label.text = item.text } 當然,別忘了把tableView(_:cellForRowAt:)和tableView(_:didSelectRowAt:)方法的內容也更新一下: override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "ChecklistItem", for: indexPath) //新增下面的程式碼 let item = items[indexPath.row] let label = cell.viewWithTag(1000) as UILabel label.text = item.text configureCheckmark(for: cell, with:item) return cell } //MARK:- Table View Delegate override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if let cell = tableView.cellForRow(at: indexPath){ let item = items[indexPath.row] item.toggleChecked() configureCheckmark(for: cell, with: item) } tableView.deselectRow(at: indexPath, animated: true) }
需要注意的是,在tableView(_:didSelectRowAt:)這個方法中,我們對item物件呼叫了一個新的toggleChecked()方法,而不是直接修改ChecklistItem的checked屬性。
當然,強迫症患者可能早就迫不及待的想要修復Xcode提出的新錯誤指示了~
開啟ChecklistItem.swift,然後更改其中的程式碼如下: import Foundation class ChecklistItem{ var text = "" var checked = false func toggleChecked(){ checked = checked } }
如你所見,該⽅法其實之前在didSelectRowAt中曾實現過,只不過這次我們把它添 加為ChecklistItem物件的⼀個單獨方法。
好的面向物件設計法則是,儘量讓物件管理⾃己的狀態。 ⽐如在這裡,之前是由檢視控制器來完成狀態切換⼯作,⽽這裡改為由ChecklistItem⾃己來切換。
此時編譯執行應用。
看起來跟之前一樣了~也就是說,花了這麼長時間,就是為了達到跟之前一樣的效果?~
其實還是不太⼀樣的。⾸先,整個程式碼結構更加清晰明瞭,可以有效避免bug的出現。通過使⽤用陣列,我們讓程式變得更加靈活,現在表檢視可以處理任意行的資料了。
在開發項⽬的過程中,我們經常會不斷重新組織程式碼,術語黨給了⼀個可怕的名詞叫程式碼重構。因為在最開始寫的時候,不可能100%都是完美的。然後程式猿開始不斷添磚加瓦,直到整個程式碼結構開始變得混亂,這時候就要修修補補做做清潔工作了。然後過了⼀段時間再次變得⼀團亂麻,然後苦逼的你又要開始清理⼀下。整個過程看起來永無休止(要不要這麼苦逼?)
還有⼀些程式猿宣傳⾃己從未清理過⾃己的程式碼。雖然有少數⽜人可以做到從項⽬開始到最後始終保持程式碼結構的完美,但⼤多數開發者這樣做的後果是讓程式⼀團糟,對於後續維護的⼈人來說簡直就是⼀場災難。
除⾮你的專案完成後這輩子都不會有機會碰到了(包括別人),否則還是別這麼缺德。做⼈,還是厚道點好。
好了,這一課的內容就到此結束了。
從下一課開始,我們又將開始學習全新的知識~
本課福利彩蛋:


聯絡方式:
- 微信討論群請先添加個人微信iseedo,說明要加入iOS開發討論
- QQ討論群:375143733
- 微信公眾號:icodefun
答疑說明:
有相關的問題請到課程答疑專區提問: http:// icode.fun/ask/forum.php