У меня есть одна структура 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
, он автоматом сделает правильный.
@Sweeper Да, ты прав. Я удалил его, и он работает.
@malhal Спасибо, я только что реализовал это в ответе ниже. Я полагался на предложения XCode, которые, похоже, сбили меня с пути.
Следуя отзывам в комментариях, я внес следующие изменения, чтобы очень просто решить эту проблему с привязкой 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()
}
Спасибо за отзыв в комментариях.
Во-первых, у вас не должно быть такого
init
. Почему у вас вообще стоятisLiked
иisBookmarked
? Источник истины должен быть только один.