我正在用关联的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分配。
发布于 2022-09-27 14:26:18
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")
}
}这可以为它提供一些线索。
还有这。
https://stackoverflow.com/questions/73868976
复制相似问题