ID-тест происходит в коллекции несколько раз, это даст неопределенные результаты

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

Мой цикл foreach:

Section(header: Text("Reports")) {
    ForEach(stashed.userReports, id: \.self) { report in
        NavigationLink(destination: ReportView(report: report)) {
            VStack(alignment: .leading) {
                Text("Date")
                    .bold()
                Text(report)
            }
        }
    }
}

модель

@Model
final class ActiveStash {
    var substanceClass: String
    var substance: String
    var weight: UInt
    var substanceCost: UInt?
    var StashDescription: String?
    var date: Date
    var unit: String
    var dosages: Int?
    @Attribute(.unique) var userReports: [String]

Я пытался присвоить уникальный атрибут моему массиву userReports, но безуспешно.

Сделайте идентификатор чем-то стабильным и уникальным.

lorem ipsum 19.05.2024 03:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
342
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Бро, похоже, проблема возникает потому, что массив userReports считает отчеты с одинаковым содержимым идентичными, даже если это разные экземпляры. Это происходит потому, что userReports представляет собой массив строк и не различает отчеты с одинаковым содержимым.

Чтобы исправить это, вы можете изменить свою модель данных, чтобы использовать уникальный идентификатор для каждого отчета. Вот как вы можете это сделать:

Вместо хранения строк непосредственно в массиве userReports создайте новую структуру Report для представления каждого отчета. Эта структура может включать в себя такие свойства, как содержимое отчета и уникальный идентификатор.

Сделав это, вы гарантируете, что даже если два отчета имеют одинаковое содержимое, они будут рассматриваться как разные, поскольку каждый из них имеет свой собственный уникальный идентификатор. Это должно предотвратить проблему дублирования представлений, отображающих один и тот же контент.

// Define a struct for the report
struct Report: Identifiable {
    let id = UUID()
    let content: String // Change this to whatever properties your report has
}
// Modify the userReports array in ActiveStash to hold Report instances
@Model
final class ActiveStash {
    // Your other properties...

    // Instead of [String], use [Report]
    @Attribute(.unique) var userReports: [Report]
}
// Modify your ForEach loop to use the unique identifier
Section(header: Text("Reports")) {
    ForEach(stashed.userReports) { report in
        NavigationLink(destination: ReportView(report: report)) {
            VStack(alignment: .leading) {
                Text("Date")
                    .bold()
                Text(report.content) // Access the content of the report
            }
        }
    }
}

Вам также необходимо привести Report в соответствие с Codable, поскольку он используется в классе @Model.

Joakim Danielson 19.05.2024 07:21

@Omair Спасибо, я раньше пытался использовать структуру, но не до конца ее понял.

Defaced.Face 19.05.2024 15:51

Другие вопросы по теме