繁体   English   中英

iOS:MVVM-C ViewController 超类

[英]iOS: MVVM-C ViewController super class

我有 MVVM-C 架构。 每个UIViewController都有一个ViewModelCoordinatorDelegate用于在需要执行导航时通知Coordinator 创建 VC 的代码会重复自己,我认为创建一个超类来统一创建 VC 的所有静态函数会很棒。 像这样:

import UIKit

class MVVMCViewController: UIViewController {
    
    weak var coordinatorDelegate: CoordinatorDelegate?
    var viewModel: Modelling?
    
    static func initVC(storyboard: Storyboard,
                       coordinatorDelegate: CoordinatorDelegate?,
                       viewModel: Modelling?) -> Self {
        let viewController = Self.instantiate(in: storyboard)
        viewController.coordinatorDelegate = coordinatorDelegate
        viewController.viewModel = viewModel
        return viewController
    }
}

所有CoordinatorDelegateProtocols将继承CoordinatorDelegate和所有ViewModels将被继承Modelling

但是子类化并不顺利。

在此处输入图片说明

有任何想法吗?

嗨,这个模型不能正常工作。

MVMCViewController 有硬编码协议作为变量类型,所以你应该在你的 childVC 中拥有相同的协议。

为了让它像你希望的那样工作 MVVMCViewController 显示是通用的(但它可能有很多问题),比如

class MVVMCViewController<T: Modelling, U: CoordinatorDelegate>: UIViewController {
    
    weak var coordinatorDelegate: U?
    var viewModel: T?

}

或将刚刚投射的属性添加到 ConnectViewController

class ConnectViewController: MVVMCViewController {
    
    weak var coordinatorDelegate: CoordinatorDelegate?
    var viewModel: Modelling?
    var currentDelegate: ConnectViewControllerCoordinatorDelegate? {
         coordinatorDelegate as? ConnectViewControllerCoordinatorDelegate
    }
    var currentVM: ConnectViewModel? {
         viewModel as? ConnectViewModel
    }
}

您的超类MVVMCViewController定义了两个属性coordinatorDelegateviewModel 如果您只需要在您的子类ConnectViewController访问它们,只需正常访问即可。 您不需要再次定义它。

此外,在您的父类中,您有weak var coordinatorDelegate: CoordinatorDelegate? . 但是在您的子类 ( ConnectViewController ) 中,您使用不同的类型 ( ConnectViewControllerCoordinatorDelegate? ) 重新声明了该属性。 这是非法的,即使它是CoordinatorDelegate的子类。

因此,要么

  1. 重命名子类中的属性以避免冲突
  2. 保留名称和类型,但如果您计划在子类中添加其他功能,请为该属性添加一个override关键字
  3. 如果您不需要向其添加其他功能,请不要在您的子类中再次声明该属性。 直接访问就可以了。

在此处参考继承如何在 Swift 中工作: https : //docs.swift.org/swift-book/LanguageGuide/Inheritance.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM