Как установить диапазон для foreach

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

if selectedTab == "LAST 7 ENTRIES"{
                    ForEach(self.entryController.moods, id: \.id )
                    {mood in
                        NavigationLink(destination: EntryDetailView(entryController: self.entryController, mood: mood)) {
                            HStack{
                                VStack {
                                    Text(mood.monthString)
                                        .font(.title2)
                                        .fontWeight(.bold)
                                        .foregroundColor(mood.emotion.moodColor)
                                    Text("\(mood.dayAsInt)")
                                        .font(.title2)
                                        .fontWeight(.bold)
                                        .foregroundColor(mood.emotion.moodColor)
                                }
                                RowView(mood: mood)
                            }
                        }
                    }.onDelete { (index) in
                        self.entryController.deleteMood(at: index)
                }
            }

Это мой контроллер входа и модель

    @Published var moods: [Mood] = [];
    struct Mood: Codable, Equatable, Identifiable {
        var id = UUID()
        let emotion: Emotion
        var activity: String?
        var comment: String?
        let date: Date
        
        init(emotion: Emotion, activity: String?, comment: String?, date: Date) {
            self.emotion = emotion
            self.activity = activity
            self.comment = comment
            self.date = date
        }
    }

func loadFromPersistentStore() {
        
        // Plist -> Data -> Stars
        let fileManager = FileManager.default
        guard let url = persistentFileURL, fileManager.fileExists(atPath: url.path) else { return }
        
        do {
            let data = try Data(contentsOf: url)
            let decoder = PropertyListDecoder()
            moods = try decoder.decode([Mood].self, from: data)
        } catch {
            print("error loading stars data: \(error)")
        }
    }

«... но все равно получаю ошибку.», какую ошибку вы получаете и в какой строке?

workingdog support Ukraine 09.04.2022 14:51

Разве это не то же самое вопрос, о котором вы спрашивали вчера, хотя и с немного другим именем пользователя? Вы должны обработать это в своем классе entryController, чтобы помимо вашего свойства moods у вас также были свойства reversedMoods и lastSevenMoods, а затем использовать тот, который подходит для текущего варианта использования.

Joakim Danielson 09.04.2022 15:05

@JoakimDanielson Да, я хотел бы сделать это в своем контроллере ввода, но я не могу найти для этого образца, что сбивает с толку в этой части ...

hw98 09.04.2022 18:13
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
3
3
84
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вот подход для вас, ваш вопрос не содержит необходимых кодов для ответа на него, однако в этом примере вы можете найти способ решения своей проблемы:

struct ContentView: View {
    
    let array: [Int] = Array(1...28)
    
    var body: some View {

        ForEach(array.indices, id:\.self) { index in
            
            if ((array.count - 7) < array[index]) {

                Text("\(array[index])")
                    .padding()
            }
   
        }
   
    }
}

вы можете попробовать что-то вроде этого:

if (entryController.moods.count >= 7) {
    ForEach((entryController.moods.endIndex-7)..<entryController.moods.endIndex, id: \.self) { ndx in
        let mood = entryController.moods[ndx]
        // ...
    }
    .onDelete { index in
        if let theFirst = index.first {
            let ndx = (entryController.moods.endIndex-7) + theFirst
            self.entryController.deleteMood(at: ndx)
        }
    }
}

Обратите внимание, что вам нужно будет настроить индекс в .onDelete, как показано в примере кода.

Спасибо ! Эта работа для меня! На самом деле я хочу сделать это на моем контроллере ввода, а не на просмотре, но я тоже понятия не имею, это работа, но .ondelete есть какая-нибудь ссылка на то, как это настроить?

hw98 09.04.2022 18:11

обновил мой ответ .onDelete примером кода.

workingdog support Ukraine 10.04.2022 00:43
Ответ принят как подходящий

Попробуйте просто использовать suffix для массива, документация здесь. Простейшим примером будет что-то вроде этого.

struct ContentView: View {
    
    var items = [1,2,3,4,5]
    var body: some View {
        List {
            ForEach(items.suffix(2), id: \.self) { item in
                Text("\(item)")
            }
        }
        .onAppear {
            print(items.suffix(2))
        }
    }
}

вывод на печать

[4, 5]

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