簡體   English   中英

無法使用 Swift 5.7 從其托管 ViewController 初始化具有關聯 ViewModel 類型的 SwiftUI

[英]SwiftUI with associated ViewModel Type can't be initialised from its hosting ViewController with Swift 5.7

我正在定義一個具有關聯 ViewModel 協議類型的 SwiftUI 視圖。 但是,在構建Type 'any MyViewModelType' cannot conform to 'MyViewModelType'時出現此錯誤。

這是我的完整代碼。

protocol MyViewModelType: ObservableObject {
    var loadData: CGFloat { get }
}


struct MyView<ViewModel>: View where ViewModel: MyViewModelType {
    @ObservedObject private var viewModel: ViewModel

    init(viewModel: any MyViewModelType) {
        self.viewModel = viewModel as! ViewModel
    }

    var body: some View {
        Text("Hi")
    }
}

class SubscriptionViewV2Controller: UIHostingController<MyView<MyViewModelType>> {
    init(viewModel: any MyViewModelType) {
        super.init(rootView: MyView(viewModel: viewModel))
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.isNavigationBarHidden = true
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .darkContent
    }

    @MainActor @objc required dynamic init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

我不確定我做錯了什么?

另外,我不知道為什么 Xcode 會在這里拋出錯誤

init(viewModel: any MyViewModelType) {
    self.viewModel = viewModel as! ViewModel
}

由於該錯誤,我需要強制viewModel分配。

SwiftUI generics 需要一種具體類型才能使用。 這可以是任何MyViewModelType 但是您必須指定它只是一個特定的。 any是完全相反的。

protocol MyViewModelType: ObservableObject {
    var loadData: CGFloat { get }
}

struct MyView<T>: View where T: MyViewModelType {
    @ObservedObject private var viewModel: T

    init(viewModel: T) {
        self.viewModel = viewModel
    }

    var body: some View {
        Text("Hi")
    }
}

class SubscriptionViewV2Controller<T>: UIHostingController<MyView<T>> where T: MyViewModelType {
    init(viewModel: T) {
        super.init(rootView: MyView(viewModel: viewModel))
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        navigationController?.isNavigationBarHidden = true
    }

    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .darkContent
    }

    @MainActor @objc required dynamic init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

可能會有所啟發。

還有這個

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM