Может ли Swift Enum одновременно иметь raw value и associated value?

«Может ли Swift Enum одновременно иметь raw value и associated value?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, не может. В Swift перечисление (enum) может быть определено либо с raw values, либо с associated values, но не с обоими одновременно для одного и того же case. Это архитектурное ограничение языка.

  • Raw Value — это предопределенное значение примитивного типа (String, Int, Character и т.д.), одинаковое для всех экземпляров конкретного кейса.
    enum NetworkError: Int {
        case badRequest = 400
        case unauthorized = 401
        case notFound = 404
    }
    let errorCode = NetworkError.unauthorized.rawValue // 401
  • Associated Value — это дополнительные данные произвольного типа, которые могут различаться у разных экземпляров одного и того же кейса.
    enum NetworkResult {
        case success(data: Data, code: Int)
        case failure(error: Error)
    }
    let result = NetworkResult.success(data: someData, code: 200)

Почему нельзя совместить? Семантика raw value подразумевает, что кейс сам по себе является уникальным значением. Associated value же делает каждый экземпляр кейса контейнером для других данных, что противоречит идее фиксированного raw-значения.