Привязка/передача по ссылке для массива из структуры в структуру

У меня есть одна структура struct DropletsView: View {}, которая имеет следующий массив: @State private var savedQuotes: [Quote] = [] (Quote определен в другом месте как пользовательский тип для моего приложения).

Я хотел бы передать этот массив savedQuotes в другую структуру (struct SingleQuoteView: View{}), чтобы я мог изменить массив изнутри SingleQuoteView.

Я пытался передать это по ссылке, как это можно сделать в C++, но на этом пути столкнулся со многими проблемами. Теперь я был бы признателен за указания по реализации @Binding для этого массива внутри SingleQuoteView.

Я объявляю это так: SingleQuoteView(quote: quote) потому что на данный момент его конструктор таков:

init(quote: Quote) {
    self.quote = quote
    self._isBookmarked = State(initialValue: isQuoteBookmarked(quote))
    self._isLiked = State(initialValue: isQuoteLiked(quote))
}

Я предполагаю, что мне нужно создать переменную того же типа в SingleQuoteView, например:

@Binding private var savedQuotes: [Quote]
    
init(quote: Quote, savedQuotesArg: Binding<[Quote]>) {
    self.quote = quote
    self._isBookmarked = State(initialValue: isQuoteBookmarked(quote))
    self._isLiked = State(initialValue: isQuoteLiked(quote))
    self._savedQuotes = savedQuotesArg
}

И объявите эту структуру как таковую: SingleQuoteView(quote: quote, savedQuotesArg: $savedQuotes).

Однако это приводит к следующей ошибке внутри конструктора (init()): Variable 'self.savedQuotes' used before being initialized

Моя цель — изменить переменную состояния savedQuotes в DropletsView как таковую внутри одной из функций SingleQuoteView:

private func toggleBookmark() {
    isBookmarked.toggle()
    
    var bookmarkedQuotes = getBookmarkedQuotes()
    if isBookmarked {
        bookmarkedQuotes.append(quote)
    } else {
        bookmarkedQuotes.removeAll { $0.id == quote.id }
        
        // ------------------ line I want to add: ----------------
        savedQuotes.removeAll { $0.id == quote.id }
        // ------------------ line I want to add^^ ----------------
    }
    saveBookmarkedQuotes(bookmarkedQuotes)
    
    interactionsIncrease()
}

Во-первых, у вас не должно быть такого init. Почему у вас вообще стоят isLiked и isBookmarked? Источник истины должен быть только один.

Sweeper 11.07.2024 09:41

Просто удалите кастом init, он автоматом сделает правильный.

malhal 11.07.2024 17:36

@Sweeper Да, ты прав. Я удалил его, и он работает.

Daggerpov 11.07.2024 23:02

@malhal Спасибо, я только что реализовал это в ответе ниже. Я полагался на предложения XCode, которые, похоже, сбили меня с пути.

Daggerpov 11.07.2024 23:03
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
2
4
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

Передано savedQuotes с DropletsView на SingleQuoteView вот так: SingleQuoteView(quote: quote, savedQuotes: $savedQuotes)

Создал эту привязку внутри SingleQuoteView: Binding var savedQuotes: [Quote]

Полностью удален метод init().

Затем я добавил сюда именно ту строку, которую хотел:

private func toggleBookmark() {
    isBookmarked.toggle()
    
    var bookmarkedQuotes = getBookmarkedQuotes()
    if isBookmarked {
        bookmarkedQuotes.append(quote)
    } else {
        bookmarkedQuotes.removeAll { $0.id == quote.id }
        savedQuotes.removeAll { $0.id == quote.id }
    }
    saveBookmarkedQuotes(bookmarkedQuotes)
    
    interactionsIncrease()
}

Спасибо за отзыв в комментариях.

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