我希望得到评估以确保正确实施Swift MVVM。
此外,如果还有其他可以补充的内容,请对其进行修改。
在显示ViewController之前,AppDelegate指定一个ViewModel。
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions:
[UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if let rootVC = window?.rootViewController as? ViewController {
rootVC.viewModel = MainViewModel()
}
return true
}
在ViewController中执行数据绑定。 TableView也使用扩展名指定。
class ViewController: UIViewController {
var viewModel: MainViewModel!
override func viewDidLoad() {
super.viewDidLoad()
viewModel.bind { [weak self] in
DispatchQueue.main.async {
print("TableView reloadData")
// tableView reload
}
}
viewModel.addText(addText: "test")
print("count \(viewModel.count)")
}
}
class TextListCell: UITableViewCell {
}
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return viewModel.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell: TextListCell = tableView.dequeueReusableCell(withIdentifier: "TextListCell", for: indexPath) as! TextListCell
let test = viewModel.texts[indexPath.row]
return cell
}
}
extension ViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("\(indexPath.row.description)")
}
}
模型被称为数据管理。 但是,我不了解业务逻辑是由模型处理的。
struct TextEditor {
let text: String
}
更新模型后,将结果告知ViewModel并准备要在View中显示的数据。
protocol MainViewModelProtocol: class {
func bind(didChange: @escaping () -> Void)
func addText(addText: String)
var count: Int { get }
var texts: Array<TextEditor> { get }
}
class MainViewModel: MainViewModelProtocol {
private var didChange: (() -> Void)?
var texts: [TextEditor] = [] {
didSet {
didChange?()
}
}
func bind(didChange: @escaping () -> Void) {
self.didChange = didChange
}
var count: Int {
return texts.count
}
func addText(addText: String) {
self.texts.append(TextEditor(text: addText))
}
}
答案 0 :(得分:1)
我认为很少有改进可以改善它:
您的ViewModel应该充当表视图的数据源。
协议旨在易于组合并且应该较小。我觉得您的MainViewModelProtocol
非常适合您的ViewModel。尝试使您的协议也可以被其他事物所遵循。我不知道您项目的确切结构,但我认为其他ViewModel不需要您在协议中声明的许多功能
cellForRowAt
函数中,您正在进行强制解包。可能只有我一个人,但是强制展开对我来说太危险/危险。dequeueReusableCell
中,您要使用标识符使单元出队。尽量避免使用字符串类型的api。一种方法是extending UITableViewCell
with an identifier property。请注意,每个项目都是不同的,并且很多项目架构都是基于团队知识,项目范围和截止日期。在这种情况下,对鹅有什么好处可能对鹅没有帮助