Различия в теле просмотра в SwiftUI

У меня есть список меню

let muscleEtfs = Menu(name:"MuscleETFs",  image:"image", destination: .muscleETFs)

let menus: [Menu] = [home, marketTrend, indexes, sectors, stockAnalysis, backtest, screener, myPortfolio, watchList, muscleStocks, muscleEtfs]

Моя цель - условно изменить пункт назначения NavigationLink в SwiftUI. Может ли кто-нибудь объяснить мне, почему корпус переключателя не работает, но если работает.

let muscleEtfs = Menu(name:"MuscleETFs",  image:"image", destination: .muscleETFs)

    var body: some View {
        let menus: [Menu] = [home, marketTrend, indexes, sectors, stockAnalysis, backtest, screener, myPortfolio, watchList, muscleStocks, muscleEtfs]

        return List {
            ForEach(menus) { menu in

                // This does not work
                switch menu.destination {
                case .news:
                    NavigationLink(
                            destination: HomeNewsView(menu: menu)
                    )
                    {
                        Text("\(menu.name)")
                    }
                default:
                    NavigationLink(
                            destination: HomeNewsView(menu: menu)
                    )
                    {
                        Text("\(menu.name)")
                    }

                }

                // This does
                if menu.destination == .news   {
                    NavigationLink(
                            destination: HomeNewsView(menu: menu)
                    )
                    {
                        Text("\(menu.name)")
                    }
                }
            }
        }

Использование условий переключения вызывает ошибку компиляции в Xcode

Замыкание, содержащее оператор потока управления, нельзя использовать с построителем функций ViewBuilder


person Smin    schedule 23.12.2019    source источник
comment
переключатели, возвращающие представления, не реализованы так, как вы этого хотите. Вы можете использовать логику внутри метода или использовать только if / else.   -  person Fabian    schedule 23.12.2019
comment
Отвечает ли это на ваш вопрос? Альтернатива оператору переключения в блоке SwiftUI ViewBuilder?   -  person nayem    schedule 23.12.2019
comment
Спасибо. только это будет работать, а не View или AnyView, только некоторое представление в качестве возвращаемого типа.   -  person Smin    schedule 23.12.2019


Ответы (1)


Это работает, помните, что возвращаемый тип AnyView или View не будут работать.

func destinationView (меню: меню) -> некоторый вид {

        switch menu.destination {
        case .news:
            return NavigationLink(
                    destination: HomeNewsView(menu: menu)
            )
            {
                Text("\(menu.name)")
            }
        default:
            return NavigationLink(
                    destination: HomeNewsView(menu: menu)
            )
            {
                Text("\(menu.name)")
            }
        }

    }
person Smin    schedule 23.12.2019