【问题标题】:Please rate your Swift MVVM implementation [closed]请评价您的 Swift MVVM 实现 [关闭]
【发布时间】:2019-08-08 01:10:03
【问题描述】:

我希望接受评估以确保正确实现 Swift MVVM。

另外,如果还有什么可以补充的,请修改。

1。 AppDelegate.swift

在显示 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
}

2。 ViewController.swift

在 ViewController 中执行 DataBinding。 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)")
   }
}

3。 MainModel.swift

模型被称为数据管理。 但是,我不明白业务逻辑是由模型处理的。

struct TextEditor {
let text: String
}

4。 MainViewModel.swift

模型更新后,将结果通知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))
}
}

【问题讨论】:

  • 代码审查属于Code Review。请从此处删除您的问题并在此处发布。
  • 虽然代码审查可以提出有趣的问题,但我们不在这里处理这些问题。或许 Code Review 网站会更好。
  • 我会在 Code Review 上发布。谢谢你的回答。

标签: swift mvvm


【解决方案1】:

我认为很少有改进会让它变得更好:

  1. 您的 ViewModel 应充当 tableview 的数据源。

  2. 协议旨在易于组合并且应该很小。我觉得您的 MainViewModelProtocol 非常适合您的 ViewModel。尝试使您的协议也可以被其他事物所遵循。我不知道您的项目的确切结构,但我认为您在协议中声明的很多功能不需要您的其他 ViewModel

  3. cellForRowAt 函数中,您正在执行强制展开。可能只有我一个人,但对我来说,强制解包感觉太危险/危险信号。
  4. dequeueReusableCell 中,您正在使用标识符将单元格出列。尽量避免使用字符串类型的 api。其中一种方式是extending UITableViewCell with an identifier property

请注意,每个项目都是不同的,许多项目架构都基于团队知识、项目范围和截止日期。在这种情况下,对鹅有益的东西未必对鹅有益

【讨论】:

    猜你喜欢
    • 2013-10-12
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 2012-04-05
    • 2014-11-16
    • 2017-10-17
    • 2011-02-25
    • 1970-01-01
    相关资源
    最近更新 更多