當我嘗試從方法回傳符合 View 協議的不同自定義視圖時出現編譯錯誤。這是一個描述該問題的簡單示例。
我希望有一個方法可以根據列舉情況回傳不同的自定義視圖。當我嘗試實作這一目標時,我得到不同的編譯錯誤:
enum AppScreen: String, CaseIterable {
case home
case detail
}
struct ContentView: View {
var body: some View {
NavigationView {
List {
ForEach(AppScreen.allCases, id: \.self) { screen in
NavigationLink(destination: getSomeView(screen)) {
Text(screen.rawValue)
}
}
}
List {
ForEach(AppScreen.allCases, id: \.self) { screen in
NavigationLink(destination: getAnyView(screen)) {
Text(screen.rawValue)
}
}
}
}
}
private func getSomeView(_ screen: AppScreen) -> some View {
switch screen {
case .home:
return HomeView()
case .detail:
return DetailView()
}
}
private func getAnyView(_ screen: AppScreen) -> any View {
switch screen {
case .home:
return HomeView()
case .detail:
return DetailView()
}
}
}
方法getSomeView引發以下編譯錯誤:函式宣告了一個不透明的回傳型別“某些視圖”,但其主體中的回傳陳述句沒有匹配的底層型別
方法getAnyView 可以編譯,但是當我將其呼叫為 NavigationLink 的目標時出現以下錯誤:型別“任何視圖”不能符合“視圖”
我正在學習 SwiftUI 和 Swift 5.7 中的新泛型特性。我相信我正在尋找的行為可以實作。任何幫助或指導將不勝感激,在此先感謝!
uj5u.com熱心網友回復:
這就是如何實作您正在嘗試做的事情。
getSomeView()用標記@ViewBuilder。這使它像它一樣作業var body,也ViewBuilder允許您構建不同型別的視圖。- 洗掉
return陳述句。
這是基于您的原始代碼的獨立示例:
enum AppScreen: String, CaseIterable {
case home
case detail
}
struct HomeView: View {
var body: some View {
Text("HomeView")
}
}
struct DetailView: View {
var body: some View {
Text("DetailView")
}
}
struct ContentView: View {
var body: some View {
NavigationView {
List {
ForEach(AppScreen.allCases, id: \.self) { screen in
NavigationLink(destination: getSomeView(screen)) {
Text(screen.rawValue)
}
}
}
}
}
@ViewBuilder
private func getSomeView(_ screen: AppScreen) -> some View {
switch screen {
case .home:
HomeView()
case .detail:
DetailView()
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/510470.html
標籤:仿制药迅捷迅捷5.7
