Учебник по Swift UI ОШИБКА "Замыкание, содержащее оператор потока управления, нельзя использовать с построителем функций ViewBuilder"
Я попробовал учебник по swiftUI "Обработка пользовательского ввода".
https://developer.apple.com/tutorials/swiftui/handling-user-input
Реализация с "For" вместо "For Each". Но возникает ошибка "Замыкание, содержащее оператор потока управления, не может использоваться с построителем функций ViewBuilder".
Как я это делаю?
ОТ:
import SwiftUI
struct LandmarkList: View {
@State var showFavoritesOnly = true
var body: some View {
NavigationView{
List{
Toggle(isOn: $showFavoritesOnly){
Text("Show FavatiteOnly")
}
ForEach(landmarkData) { landmark in
if !self.showFavoritesOnly || landmark.isFavorite {
NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
LandmarkRow(landmark: landmark)
}
}
}
}
.navigationBarTitle(Text("Landmarks"))
}
}
}
ТО (я написал):
import SwiftUI
struct LandmarkList: View {
@State var showFavoritesOnly = true
var body: some View {
NavigationView{
List{
Toggle(isOn: $showFavoritesOnly){
Text("Show FavatiteOnly")
}
for landmark in landmarkData {
if $showFavoritesOnly || landmark.isFavorite {
NavigationLink(destination: LandmarkDetail(landmark: landmark)){
LandmarkRow(landmark: landmark)}
}
}
}
.navigationBarTitle(Text("Landmarks"))
}
}
}
2 ответа
В
ForEach
подтверждает , поэтому по своей сути это
View
так же, как
TextField
. Отношения ForEach
Вы не можете использовать обычный
for-in
потому что не понимает, что такое императив for-loop. В
ViewBuilder
может понять другой поток управления, например
if
,
if-else
или же
if let
используя buildEither(first:), buildEither(second:) и buildif(_:) соответственно.
Попробуйте закомментировать оператор if, и это может выявить настоящую ошибку. Вот один пример: я получал эту ошибку из-за отсутствующего связанного значения перечисления, переданного одному из моих представлений.
Вот как это выглядело до и после:
До
Group {
if let value = valueOrNil {
FooView(
bar: [
.baz(arg1: 0, arg2: 3)
]
)
}
}
После
Group {
if let value = valueOrNil {
FooView(
bar: [
.baz(arg1: 0, arg2: 3, arg3: 6)
]
)
}
}