Использование Slice и OptionalSlice

August 26, 2025 · View on GitHub

Slice и OptionalSlice — это компоненты библиотеки AppState, которые позволяют вам получать доступ к определенным частям состояния вашего приложения. Они полезны, когда вам нужно манипулировать или наблюдать за частью более сложной структуры состояния.

Обзор

  • Slice: позволяет получать доступ и изменять определенную часть существующего объекта State.
  • OptionalSlice: работает аналогично Slice, но предназначен для обработки необязательных значений, например, когда часть вашего состояния может быть nil или нет.

Ключевые особенности

  • Выборочный доступ к состоянию: получайте доступ только к той части состояния, которая вам нужна.
  • Потокобезопасность: как и другие типы управления состоянием в AppState, Slice и OptionalSlice являются потокобезопасными.
  • Реактивность: представления SwiftUI обновляются при изменении среза состояния, обеспечивая реактивность вашего пользовательского интерфейса.

Пример использования

Использование Slice

В этом примере мы используем Slice для доступа и обновления определенной части состояния — в данном случае, username из более сложного объекта User, хранящегося в состоянии приложения.

import AppState
import SwiftUI

struct User {
    var username: String
    var email: String
}

extension Application {
    var user: State<User> {
        state(initial: User(username: "Guest", email: "guest@example.com"))
    }
}

struct SlicingView: View {
    @Slice(\.user, \.username) var username: String

    var body: some View {
        VStack {
            Text("Имя пользователя: \(username)")
            Button("Обновить имя пользователя") {
                username = "NewUsername"
            }
        }
    }
}

Использование OptionalSlice

OptionalSlice полезен, когда часть вашего состояния может быть nil. В этом примере сам объект User может быть nil, поэтому мы используем OptionalSlice для безопасной обработки этого случая.

import AppState
import SwiftUI

extension Application {
    var user: State<User?> {
        state(initial: nil)
    }
}

struct OptionalSlicingView: View {
    @OptionalSlice(\.user, \.username) var username: String?

    var body: some View {
        VStack {
            if let username = username {
                Text("Имя пользователя: \(username)")
            } else {
                Text("Имя пользователя недоступно")
            }
            Button("Установить имя пользователя") {
                username = "UpdatedUsername"
            }
        }
    }
}

Лучшие практики

  • Используйте Slice для необязательного состояния: если ваше состояние гарантированно не является необязательным, используйте Slice для доступа к нему и его обновления.
  • Используйте OptionalSlice для необязательного состояния: если ваше состояние или часть состояния является необязательной, используйте OptionalSlice для обработки случаев, когда значение может быть nil.
  • Потокобезопасность: как и State, Slice и OptionalSlice являются потокобезопасными и предназначены для работы с моделью параллелизма Swift.

Заключение

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


Этот перевод был сгенерирован автоматически и может содержать ошибки. Если вы носитель языка, мы будем признательны за ваши исправления через Pull Request.