在将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())