首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何返回不透明类型的泛型类

如何返回不透明类型的泛型类
EN

Stack Overflow用户
提问于 2021-11-15 11:20:27
回答 2查看 163关注 0票数 1

如何返回泛型类的不透明类型?

代码语言:javascript
复制
func makeFAQController() -> UIHostingController<some View> {
    let viewModel = FAQViewModel()
    let view = FAQView().environmentObject(viewModel)
    let controller = UIHostingController(rootView: view)
    return controller
}

错误:无法在强制中将“UIHostingController”类型的值转换为“UIHostingController”类型

代码语言:javascript
复制
func makeFAQController() -> UIHostingController<FAQView> {
    let viewModel = FAQViewModel()
    let view = FAQView().environmentObject(viewModel)
    let controller = UIHostingController(rootView: view)
    return controller
}

在强制中,

不能将“UIHostingController”类型的值转换为“UIHostingController”类型

如果可能的话,我想避免类型擦除。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-15 11:32:07

您应该返回基类(没有比基类更通用的类,可能只有元NSObject),所以

代码语言:javascript
复制
func makeFAQController() -> UIViewController {    // << here !!
    let viewModel = FAQViewModel()
    let view = FAQView().environmentObject(viewModel)
    let controller = UIHostingController(rootView: view)
    return controller
}
票数 3
EN

Stack Overflow用户

发布于 2021-11-15 15:19:10

您最好在这里使用类型擦除的AnyView

代码语言:javascript
复制
func makeFAQController() -> UIHostingController<AnyView> {
    let viewModel = FAQViewModel()
    let view = FAQView().environmentObject(viewModel)
    let controller = UIHostingController(rootView: AnyView(view))

    return controller
}

避免AnyView的另一种方法是使makeFaqController方法的封闭类成为通用类,并在其中存储一个闭包/viewBuilder,以便在创建时用作视图宿主:

代码语言:javascript
复制
class FAQMaker<U: View> {
    fileprivate let _prepare: (FAQView) -> U
    init(_ prepare: @escaping (FAQView) -> U) {
        self._prepare = prepare
    }
    
    func makeFAQController() -> UIHostingController<U> {
        let prepared = _prapare(FAQView())
        return UIHostingController(rootView: prepared)
    }

}

前一种方法可以很好地将SwiftUI视图封装到UICollectionReusableView中。

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

https://stackoverflow.com/questions/69973585

复制
相关文章

相似问题

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