← Назад к вопросам

Что такое Raw value?

1.3 Junior🔥 161 комментариев
#Язык Swift

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Raw Value (Исходное/Сырое Значение) в Swift?

Raw value — это фундаментальное понятие в Swift, относящееся к перечислениям (enum). Это предопределённое значение базового типа (например, String, Int, Character или типа, соответствующего протоколу RawRepresentable), которое ассоциируется с каждым кейсом (вариантом) перечисления на этапе объявления.

Проще говоря, это значение "по умолчанию", которое автоматически присваивается каждому элементу enum, если тип перечисления поддерживает raw values. Это позволяет легко конвертировать кейсы перечисления в их базовые представления и обратно.

Ключевые характеристики и синтаксис

  1. Типы для Raw Values: Swift позволяет использовать в качестве raw value следующие типы:
    *   `String`
    *   `Int`
    *   `Character`
    *   Типы с плавающей точкой (`Float`, `Double`)
    *   Любой тип, соответствующий протоколу `RawRepresentable` (например, `UInt8`).

  1. Автоматическое присвоение значений:
    *   Для `Int`: если не указать явно, значения присваиваются по порядку, начиная с 0. Если указать значение для одного кейса, последующие будут увеличиваться на 1.
    *   Для `String`: по умолчанию raw value равно имени самого кейса в виде строки.

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

1. Перечисление с Raw Value типа String

Это наиболее распространённый пример, часто используемый для работы с идентификаторами, кодами ответов API и т.д.

enum HTTPStatus: String {
    case success = "OK"
    case notFound = "404 Not Found"
    case serverError = "500 Internal Server Error"
}

let responseStatus = HTTPStatus.success
print(responseStatus.rawValue) // Выведет: "OK"

// Обратное преобразование (инициализация из raw value)
if let status = HTTPStatus(rawValue: "404 Not Found") {
    print(status) // Выведет: notFound
} else {
    print("Некорректное значение")
}
// Инициализатор `init?(rawValue:)` является failable (возвращающим опционал), так как переданное значение может не соответствовать ни одному кейсу.

2. Перечисление с Raw Value типа Int

Классический пример, где важен порядок или числовое представление.

enum Planet: Int {
    case mercury = 1 // Явно задаём начало отсчёта с 1
    case venus       // Автоматически получит значение 2
    case earth       // 3
    case mars        // 4
}

let earth = Planet.earth
print("Порядковый номер Земли: \(earth.rawValue)") // Выведет: Порядковый номер Земли: 3

// Преобразование числа обратно в кейс перечисления
let possiblePlanet = Planet(rawValue: 5) // Вернет `nil`, так как кейса с таким значением нет.

3. Перечисление с неявно заданным Raw Value

Swift может генерировать значения автоматически.

enum CompassDirection: String {
    case north, south, east, west // Каждому кейсу будет присвоено его же имя в виде строки.
}

let direction = CompassDirection.north
print(direction.rawValue) // Выведет: "north"

enum Priority: Int {
    case low, medium, high // Значения: 0, 1, 2
}
print(Priority.high.rawValue) // Выведет: 2

Отличие Raw Value от Associated Value (Ассоциированных Значений)

Это критически важное различие, которое часто проверяют на собеседованиях.

  • Raw Value — это статическое, предопределённое значение, которое является частью самого типа перечисления. Оно одинаково для всех использований данного кейса в программе и задаётся один раз при объявлении enum.
  • Associated Value — это динамическое значение, которое "прикрепляется" к экземпляру кейса перечисления в момент его создания. Оно позволяет хранить дополнительные данные различных типов вместе с кейсом.
// Пример с Associated Value
enum Barcode {
    case upc(Int, Int, Int, Int) // Ассоциированные значения при создании
    case qrCode(String)
}

let productBarcode = Barcode.upc(8, 85909, 51226, 3) // Значения (8, 85909, 51226, 3) — это Associated Values.

// Пример с Raw Value (для контраста)
enum BarcodeType: String {
    case upc = "UPC"
    case qrCode = "QR"
}
let type = BarcodeType.upc // Raw Value "UPC" предопределено и неизменно.

Практическое применение Raw Values

  1. Сериализация и десериализация: Идеально подходят для преобразования между типами Swift (кейсами enum) и их представлениями для хранения или передачи (JSON, база данных), например, коды ошибок, статусы, типы содержимого (Content-Type).
  2. Работа с системными API: Многие API Objective-C и C используют константы в виде строк или чисел. Raw values позволяют создать типобезопасную Swift-обёртку вокруг них.
  3. Упрощение логики: Замена громоздких конструкций switch или if-else для строковых или числовых констант на безопасную работу с перечислениями.

Важные технические детали

  • Все raw values для одного перечисления должны быть уникальными.
  • Перечисление с raw value автоматически соответствует протоколу RawRepresentable, который и предоставляет свойство rawValue и failable-инициализатор init?(rawValue:).
  • Raw value — это не то же самое, что ассоциированное значение. Они являются взаимоисключающими концепциями для одного перечисления: enum может иметь либо raw values, либо associated values, но не оба одновременно непосредственно в кейсах (хотя можно создать сложные структуры, комбинируя их опосредованно).

Таким образом, raw value — это мощный механизм для привязки перечислений Swift к фиксированным примитивным значениям, что значительно повышает типобезопасность, читаемость кода и упрощает его взаимодействие с внешними системами.