Добавить объявление

Enums vs Structs в Swift: когда что использовать

При разработке на Swift часто встает вопрос: выбрать перечисления или структуры? Давайте разберемся, когда какой тип подходит лучше.

Когда выбирать Enum:


Сейчас рассмотрим несколько вариантов, когда стоит выбрать перечисление:


Конечный набор состояний:

Enums отлично подходят, когда у тебя есть чётко определённые варианты, которые не будут меняться. Классический пример - состояние загрузки:

enum LoadingState {
case idle
case loading
case success(Data)
case failure(Error)
}

Преимущество: компилятор заставит обработать все кейсы в switch, что исключит ошибки.


Взаимоисключающие состояния:

Когда объект может находиться только в одном из четких состояний:

enum AuthState {
case loggedIn(User)
case loggedOut
case guest
}

Здесь невозможно одновременно быть авторизованным и гостем - это гарантирует типобезопасность.


Сопоставление с образцом (pattern matching):

Enums идеальны, когда нужно разное поведение для разных состояний:

switch authState {
case .loggedIn(let user): showProfile(user)
case .loggedOut: showLogin()
case .guest: showLimitedAccess()
}

Когда Struct работает лучше:


Рассмотрим несколько вариантов, когда стоит выбрать структуру:


Гибкость и расширяемость:

Structs позволяют создавать любые комбинации значений. Например, для тем оформления:

struct AppTheme {
var primaryColor: Color
var secondaryColor: Color
}

Можно легко добавлять новые темы без изменения существующего кода.


Конфигурации и настройки:

Когда нужно много параметров с возможностью кастомизации:

struct UserSettings {
var isDarkMode: Bool
var fontSize: CGFloat
var accentColor: Color
}

Пользователь может комбинировать параметры как угодно.


Сложные составные состояния:

Структуры могут хранить множество связанных данных:

struct NetworkState {
var isConnected: Bool
var connectionType: String
var speed: Double?
var lastError: Error?
}

Ключевые отличия:


  • Перечисления: обеспечивают безопасность на этапе компиляции, но ограничены фиксированным набором вариантов. Невозможно добавить новый кейс без изменения всех switch-блоков.

  • Структуры: дают гибкость, но требуют ручной проверки валидности данных. Нет гарантии, что все возможные значения будут обработаны.

  • Вывод:


    Выбирайте перечисления, когда работаете с фиксированным набором взаимоисключающих состояний - это даст вам безопасность на этапе компиляции и удобный pattern matching. Структуры же идеалены для гибких конфигураций и сложных данных, которые могут расширяться со временем. Главное - заранее продумать, насколько предсказуемы будут изменения в твоей модели данных. Оба инструмента мощные, просто применяются для разных задач.
    02.10.2025 34 463