SwiftUI со связанным типом ViewModel не может быть инициализирован из его хостинга ViewController с Swift 5.7

Я определяю представление SwiftUI с соответствующим типом протокола ViewModel. Однако я получаю эту ошибку при создании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назначение.

1 ответ

Для работы с дженериками SwiftUI требуется один конкретный тип. Это может быть любой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")
    }
}

Это может пролить некоторый свет на это.

Также это .

Другие вопросы по тегам