SwiftUI中NavigationLink传目标视图报错:any View无法符合View协议
问题1:Type 'any View' cannot conform to 'View'
SwiftUI的View协议包含关联类型,any View是经过类型擦除的存在类型,而NavigationLink的内容闭包要求返回具体的、遵循View协议的类型,存在类型无法直接满足这个约束,因此报错。
问题2:Property declares an opaque return type, but has no initializer expression from which to infer an underlying type
some View是不透明返回类型,只能用于函数或计算属性的返回值——它需要从具体的返回表达式推断底层类型。但存储属性无法在初始化时确定some View对应的具体类型,因此不能把它作为存储属性的类型。
解决方案:使用泛型
将MenuButton定义为泛型结构体,让目标视图的类型作为泛型参数,这样Swift可以在调用时自动推断具体的视图类型,完全满足类型约束:
struct MenuButton<DestinationView: View>: View { let iconName: String let destination: () -> DestinationView var body: some View { NavigationLink { destination() } label: { Image(systemName: iconName) .foregroundColor(.pink) .padding() } } } // 调用代码无需修改 struct MenuBar: View { var body: some View { HStack { MenuButton(iconName: "gearshape") { let user = User(firstName: "Mock", lastName: "Data", dateStarted: 142356345) return HomeView(viewModel: HomeViewModel(user: user)) } } } }
泛型参数DestinationView会在实例化MenuButton时,自动匹配闭包返回的具体视图类型(比如这里的HomeView),既避免了类型擦除的问题,也满足了NavigationLink对视图类型的要求。
内容的提问来源于stack exchange,提问作者Vadim F.
相关产品推荐
相关产品推荐

