ViewModel with POP
這邊有兩個名詞需要解釋一下,一個是 ViewModel,另一個則是 POP:
ViewModel
在 iOS 的開發模式中,從你新建一個新專案的時候,它的預設內容是以 MVC 的架構為底; 而在 MVVM 的架構中,會在 View 以及 Model 之間,多夾帶一層 ViewModel 來分工。 在實作 ViewModel 的時候,我是以 structure 的方式才建構 ViewModel, 並在裡頭宣告 init(model: Model) 的方式,來將 Model 轉成 ViewModel。
struct User {
var id: String
var name: String
var age: Int
}
struct UserViewModel {
var title: String
var content: String
init(user: User) {
title = user.name
content = "Hi, 我是 \(user.name),今年 \(user.age) 歲!"
}
}
POP
POP(Protocol-Oriendted Programing)是以 Protocol 來傳遞的方式; 以 UITableViewCell 來說,我會建立一個:
protocol UITableViewCellRepresentable {
associatedtype CellType: UITableViewCell
func cell(_ tableView: UITableView, indexPath: IndexPath) -> Self.CellType
}
然後讓 UserViewModel 或是相關的 CellViewModel 來遵守這個 protocol, 這樣 CellViewModel 都可以直接取用出相對應的 Cell! UITableViewDataSource 的 cellForRowAt 就可以簡單一些:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return viewModels[indexPath.row].cell(tableView, indexPath: indexPath)
}