[英]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.