Channel created
@SceneStorage
Это property wrapper (обертка свойства), который позволяет сохранять и восстанавливать небольшие объемы данных, связанных с конкретной сценой (Scene) в SwiftUI. Данные автоматически сохраняются и восстанавливаются системой, даже если приложение было закрыто или свернуто.

Основные особенности:
— Данные сохраняются системой и восстанавливаются при повторном открытии сцены.
— Данные связаны с конкретной сценой (например, вкладкой в приложении с несколькими окнами).
— Предназначен для хранения небольших объемов данных (например, настроек или состояния интерфейса).
— Поддерживает простые типы, такие как String, Int, Double, Bool, URL, Data и т.д.

Синтаксис
@SceneStorage("key") var propertyName: PropertyType = defaultValue

"key": Уникальный ключ, по которому данные сохраняются и восстанавливаются.
defaultValue: Значение по умолчанию, если данные по ключу отсутствуют.

Примеры использования
Сохранение текста в текстовом поле:
struct ContentView: View {
@SceneStorage("textInput") private var text: String = ""

var body: some View {
TextField("Введите текст", text: $text)
.padding()
}
}


Сохранение состояния переключателя:
struct ToggleView: View {
@SceneStorage("isToggleOn") private var isToggleOn: Bool = false

var body: some View {
Toggle("Включить", isOn: $isToggleOn)
.padding()
}
}


Сохранение выбранной вкладки:
struct TabViewExample: View {
@SceneStorage("selectedTab") private var selectedTab: Int = 0

var body: some View {
TabView(selection: $selectedTab) {
Text("Вкладка 1").tabItem { Text("Вкладка 1") }.tag(0)
Text("Вкладка 2").tabItem { Text("Вкладка 2") }.tag(1)
}
}
}


Когда использовать?
— Для сохранения состояния интерфейса (например, выбранной вкладки, раскрытого состояния списка).
— Для хранения пользовательских настроек, специфичных для конкретной сцены.
— Когда нужно, чтобы данные автоматически сохранялись и восстанавливались системой.

Ограничения:
— Объем данных: Не предназначен для хранения больших объемов данных. Для этого лучше использовать @AppStorage или другие механизмы (Core Data, UserDefaults).
— Типы данных: Поддерживает только простые типы данных. Для сложных данных потребуется сериализация (например, в Data).

Сравнение с @AppStorage
@SceneStorage: Данные привязаны к конкретной сцене. Подходит для хранения состояния интерфейса.
@AppStorage: Данные сохраняются на уровне всего приложения. Подходит для хранения глобальных настроек.

Пример
struct SettingsView: View {
@SceneStorage("lastOpenedTab") private var lastOpenedTab: Int = 0
@AppStorage("isDarkModeEnabled") private var isDarkModeEnabled: Bool = false

var body: some View {
VStack {
Text("Последняя вкладка: \(lastOpenedTab)")
Toggle("Темный режим", isOn: $isDarkModeEnabled)
}
.padding()
}
}


Советы:
— Используйте уникальные ключи для каждого свойства, чтобы избежать конфликтов.
— Не храните чувствительные данные (пароли, токены) в @SceneStorage, так как они не шифруются.
— Для сложных данных используйте сериализацию (например, в Data с помощью Codable).