簡體   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