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")
}
}
Это может пролить некоторый свет на это.
Также это .