如何返回泛型类的不透明类型?
func makeFAQController() -> UIHostingController<some View> {
let viewModel = FAQViewModel()
let view = FAQView().environmentObject(viewModel)
let controller = UIHostingController(rootView: view)
return controller
}错误:无法在强制中将“UIHostingController”类型的值转换为“UIHostingController”类型
func makeFAQController() -> UIHostingController<FAQView> {
let viewModel = FAQViewModel()
let view = FAQView().environmentObject(viewModel)
let controller = UIHostingController(rootView: view)
return controller
}在强制中,
不能将“UIHostingController”类型的值转换为“UIHostingController”类型
如果可能的话,我想避免类型擦除。
发布于 2021-11-15 11:32:07
您应该返回基类(没有比基类更通用的类,可能只有元NSObject),所以
func makeFAQController() -> UIViewController { // << here !!
let viewModel = FAQViewModel()
let view = FAQView().environmentObject(viewModel)
let controller = UIHostingController(rootView: view)
return controller
}发布于 2021-11-15 15:19:10
您最好在这里使用类型擦除的AnyView:
func makeFAQController() -> UIHostingController<AnyView> {
let viewModel = FAQViewModel()
let view = FAQView().environmentObject(viewModel)
let controller = UIHostingController(rootView: AnyView(view))
return controller
}避免AnyView的另一种方法是使makeFaqController方法的封闭类成为通用类,并在其中存储一个闭包/viewBuilder,以便在创建时用作视图宿主:
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中。
https://stackoverflow.com/questions/69973585
复制相似问题