【问题标题】:SwiftUI Providing destination for NavigationLink in the view init resulting in "Type 'any View' cannot conform to 'View'"SwiftUI 在视图 init 中为 NavigationLink 提供目的地导致 \"Type \'any View\' cannot conform to \'View\'\"
【发布时间】:2023-01-17 18:51:09
【问题描述】:
我正在尝试制作 NavigationLink 并在其初始化中提供目的地,但我收到错误消息:
输入“任何视图”不能符合“视图”
struct MenuButton: View {
let iconName: String
let destination: () -> any View
var body: some View {
NavigationLink { //Type 'any View' cannot conform to 'View'
destination()
} label: {
Image(systemName: iconName)
.foregroundColor(.pink)
.padding()
}
}
}
struct MenuBar: View {
var body: some View {
HStack {
MenuButton(iconName: "gearshape") {
//providing destination here
let user = User(firstName: "Mock", lastName: "Data", dateStarted: 142356345)
return HomeView(viewModel: HomeViewModel(user: user))
}
}
}
}
如果我在目标声明中将 any View 切换为 some View,我会收到错误消息:
属性声明了一个不透明的返回类型,但没有可从中推断基础类型的初始化表达式
【问题讨论】:
标签:
swiftui
swiftui-navigationview
【解决方案1】:
我发现的另一个选择是在 AnyView 中包装 destination() :
struct MenuButton: View {
let iconName: String
let destination: () -> any View
var body: some View {
NavigationLink {
AnyView(destination())
} label: {
Image(systemName: iconName)
.foregroundColor(.pink)
.padding()
}
}
}
【解决方案2】:
您只需要使 MenuButton 泛化于符合 View 的某种类型(比如 V):
struct MenuButton<V: View>: View {
let iconName: String
let destination: () -> V
var body: some View {
NavigationLink {
destination()
} label: {
Image(systemName: iconName)
.foregroundColor(.pink)
.padding()
}
}
}