讓不懂編程的人愛上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%都是完美的。然後程序猿開始不斷添磚加瓦,直到整個代碼結構開始變得混亂,這時候就要修修補補做做清潔工作了。然後過了?段時間再次變得?團亂麻,然後苦逼的你又要開始清理?下。整個過程看起來永無休止(要不要這麼苦逼?)
還有?些程序猿宣傳?己從未清理過?己的代碼。雖然有少數?人可以做到從項?開始到最後始終保持代碼結構的完美,但?多數開發者這樣做的後果是讓程序?團糟,對於後續維護的?人來說簡直就是?場災難。
除?你的項目完成後這輩子都不會有機會碰到了(包括別人),否則還是別這麼缺德。做?,還是厚道點好。
好了,這一課的內容就到此結束了。
從下一課開始,我們又將開始學習全新的知識~
本課福利彩蛋:
TAG:iOS開發 |