首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有关联SwiftUI类型的ViewModel不能从其宿主ViewController中用SWIFT5.7初始化

带有关联SwiftUI类型的ViewModel不能从其宿主ViewController中用SWIFT5.7初始化
EN

Stack Overflow用户
提问于 2022-09-27 14:04:07
回答 1查看 33关注 0票数 2

我正在用关联的SwiftUI协议类型定义一个ViewModel视图。但是,我在构建Type 'any MyViewModelType' cannot conform to 'MyViewModelType'时得到了这个错误。

这是我的完整密码。

代码语言:javascript
复制
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会在这里抛出错误

代码语言:javascript
复制
init(viewModel: any MyViewModelType) {
    self.viewModel = viewModel as! ViewModel
}

由于这个错误,我需要强制转换viewModel分配。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-27 14:26:18

SwiftUI泛型需要一个具体的类型来使用。这可能是任何MyViewModelType。但您必须指定它将仅是一个特定的。any正好相反。

代码语言:javascript
复制
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")
    }
}

可以为它提供一些线索。

还有

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73868976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档