0

我有 MVVM-C 拱门。每个UIViewController都有一个ViewModelandCoordinatorDelegate来通知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

但是子类化工作并不顺利。

在此处输入图像描述

有任何想法吗?

4

2 回答 2

1

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

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
    }
}
于 2021-07-24T20:03:22.777 回答
0

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

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

因此,无论是

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

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

于 2021-07-24T19:57:13.857 回答