在将SwiftUI视图作为参数传递给函数时,如何避免将其强制转换为AnyView?

在将SwiftUI视图作为参数传递给函数时,如何避免将其强制转换为AnyView?,swift,swiftui,Swift,Swiftui,我将UINavigationController用于我的SwiftUI应用程序,因为NavigationView和NavigationLink非常有限和/或有缺陷。我有一个名为pushView(..)的函数,它需要获取一个SwiftUI视图,将其包装在UIHostingController中,然后将其推到导航堆栈的顶部: func pushView(view: AnyView, animated: Bool = true) { let hostingView = UIHostingCon

我将
UINavigationController
用于我的SwiftUI应用程序,因为
NavigationView
NavigationLink
非常有限和/或有缺陷。我有一个名为
pushView(..)
的函数,它需要获取一个SwiftUI视图,将其包装在
UIHostingController
中,然后将其推到导航堆栈的顶部:

func pushView(view: AnyView, animated: Bool = true) {
    let hostingView = UIHostingController(rootView: view)
    navigationController.pushViewController(hostingView, animated: animated)
}
现在,我的大多数调用看起来像是
…pushView(AnyView(MyView())
,我必须将每个视图都转换为
AnyView
,这有点烦人和不干净


有没有更好的方法来实现这一点,这样我就不必每次都进行强制转换?

通常,如果您想将擦除视图收集到某个数组中,您需要使用
AnyView
来键入擦除视图(对于SwiftUI来说,这种方法很少见,除非您知道自己在做什么,否则这可能不是最好的方法),但在这里,由于您所做的只是推送
UIViewControllers
(这是
UIHostingController
继承的)的实例,因此您应该能够使用一个通用函数:

func pushView<V: View>(view: V, animated: Bool = true) {
    let hostingView = UIHostingController(rootView: view)
    navigationController.pushViewController(hostingView, animated: animated)
}

谢谢!我什么时候需要专门使用类型擦除?@Zorayr,更新了答案。有一些情况,但很少
pushView(view: MyView())