iOS: MVVM-C ViewController 超级 class
iOS: MVVM-C ViewController super class
我有 MVVM-C 架构。每个 UIViewController
都有一个 ViewModel
和 CoordinatorDelegate
以在需要执行导航时通知 Coordinator
。创建 VC 的代码会自行重复,我认为创建一个超级 class 来统一所有创建 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
但是子classing 工作不顺利。
有什么想法吗?
你的 superclass MVVMCViewController
定义了两个属性 coordinatorDelegate
和 viewModel
。如果您只需要在 child class ConnectViewController
中访问它们,只需正常访问即可。无需重新定义。
此外,在您的 parent class 中,您有 weak var coordinatorDelegate: CoordinatorDelegate?
。但是在你的 child class (ConnectViewController
) 中,你用不同的类型 (ConnectViewControllerCoordinatorDelegate?
) 重新声明了 属性。这是非法的,即使它是 CoordinatorDelegate
.
的子 class
因此,
- 重命名 child 中的 属性 class 以避免冲突
- 保留名称和类型,但如果您打算在 child class[=32] 中添加其他功能,请为 属性 添加一个
override
关键字=]
- 如果您不需要向它添加额外的功能,请不要在您的 child class 中再次声明 属性。直接访问即可。
请参阅此处 Swift 中继承的工作原理:https://docs.swift.org/swift-book/LanguageGuide/Inheritance.html
嗨,这个模型不能正常工作。
MVVMCViewController 将协议硬编码为变量类型,因此您应该在您的 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
}
}
我有 MVVM-C 架构。每个 UIViewController
都有一个 ViewModel
和 CoordinatorDelegate
以在需要执行导航时通知 Coordinator
。创建 VC 的代码会自行重复,我认为创建一个超级 class 来统一所有创建 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
但是子classing 工作不顺利。
有什么想法吗?
你的 superclass MVVMCViewController
定义了两个属性 coordinatorDelegate
和 viewModel
。如果您只需要在 child class ConnectViewController
中访问它们,只需正常访问即可。无需重新定义。
此外,在您的 parent class 中,您有 weak var coordinatorDelegate: CoordinatorDelegate?
。但是在你的 child class (ConnectViewController
) 中,你用不同的类型 (ConnectViewControllerCoordinatorDelegate?
) 重新声明了 属性。这是非法的,即使它是 CoordinatorDelegate
.
因此,
- 重命名 child 中的 属性 class 以避免冲突
- 保留名称和类型,但如果您打算在 child class[=32] 中添加其他功能,请为 属性 添加一个
override
关键字=] - 如果您不需要向它添加额外的功能,请不要在您的 child class 中再次声明 属性。直接访问即可。
请参阅此处 Swift 中继承的工作原理:https://docs.swift.org/swift-book/LanguageGuide/Inheritance.html
嗨,这个模型不能正常工作。
MVVMCViewController 将协议硬编码为变量类型,因此您应该在您的 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
}
}