ViewModel with POP

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)
}
comments powered by Disqus