Foreach возвращает только первое значение

#swift #foreach #swiftui

#swift #foreach #swiftui

Вопрос:

Я пытаюсь вывести все элементы в список, но цикл foreach выводит только первый и столько раз, сколько есть элементов

Если я попытаюсь отобразить какой-либо элемент следующим образом session.books[5].name , я получу желаемый, а не первый

 //...
List {
  ForEach(self.session.books) { book in
      Text(book.name)
  }
}
//...

//Model:
struct Book: Identifiable {
    var id: String = UUID().uuidString
    var name: String
}

//This way I fetch books:
func getBooks() {
        db.collection("books").addSnapshotListener { (querySnapshot, error) in
          guard let documents = querySnapshot?.documents else {
            print("No documents")
            return
          }

          self.books = documents.map { queryDocumentSnapshot -> Book in
            let data = queryDocumentSnapshot.data()
            let name = data["name"] as? String ?? ""

            return Book(id: .init(), name: name)
          }
        }
      }
 

Ответ №1:

Вы можете использовать

 List {
  ForEach(self.session.books.indices, id: .self) { index in
      Text(self.session.books[index].name)
  }
}
 

но, похоже, что-то не так с уникальностью id для ваших книг.

Комментарии:

1. Я обновил вопрос, может быть, теперь станет ясно, что не так id ?

2. Теперь все ясно. Все ваши идентификаторы — это просто пустые строки.

3. @Jessy это так, спасибо. в модели заменено var id: String = UUID().uuidString на var id: UUID

4. Почему UUID когда-либо должен быть переменным?