Проблема с ForEach и NavigationLink в SwiftUI

Вот базовый фрагмент кода, с которым у меня возникли проблемы:

import SwiftUI

struct ContentView: View {
    var pets = ["Dog", "Cat", "Rabbit"]
    var body: some View {
    NavigationView {
        List {
            ForEach(pets, id: \.self) {
                NavigationLink(destination: Text($0)) {
                    Text($0)
                }
            }
        }
        .navigationBarTitle("Pets")
    }
}

Я получаю сообщение об ошибке:

Не удалось произвести диагностику для выражения; пожалуйста, отправьте отчет об ошибке

Мое намерение здесь состояло в том, чтобы освоиться с NavigationLink и перейти на новую страницу, отображающую только текст при щелчке по элементу.

Любая помощь будет оценена по достоинству.


person bridgenbarbu    schedule 08.02.2021    source источник


Ответы (2)


Это как-то связано с используемыми вами сокращенными инициализаторами. Любая из этих альтернатив будет работать:

ForEach(pets, id: \.self) {
     NavigationLink($0, destination: Text($0))
}

ForEach(pets, id: \.self) { pet in
     NavigationLink(destination: Text(pet)) {
          Text(pet)
     }
}
person nicksarno    schedule 08.02.2021
comment
Почему простой $ 0 не работает, как указано в вопросе выше? - person Subha_26; 08.02.2021

nicksarno уже ответил, но поскольку вы прокомментировали, что не поняли, я попробую.

$ 0 ссылается на первый аргумент в текущем закрытии, если они не названы.

ForEach(pets, id: \.self) {
    // $0 here means the first argument of the ForEach closure
    NavigationLink(destination: Text($0)) {
        // $0 here means the first argument of the NavigationLink closure 
        // which doesn't exist so it doesn't work
        Text($0)
    }
}

Решение состоит в том, чтобы назвать аргумент <name> in

ForEach(pets, id: \.self) { pet in
    // now you can use pet instead of $0
    NavigationLink(destination: Text(pet)) {
        Text(pet)
    }
}

Примечание; Причина, по которой вы получаете странную ошибку, заключается в том, что он находит другой инициализатор NavigationLink, который имеет закрытие с аргументом.

person Casper Zandbergen    schedule 08.02.2021