Учебник по 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)
            ]
        )
    }
}
Другие вопросы по тегам