Можно ли добавлять методы в перечисление (enum) в Swift?

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

Ответ

Да, в Swift перечисления (enums) — это полноценные типы, поддерживающие добавление методов экземпляра и статических методов. Это ключевая особенность, отличающая Swift от многих других языков.

Пример с методами экземпляра:

enum AppState {
    case active, background, suspended

    // Метод экземпляра, работающий с текущим значением enum
    func isForeground() -> Bool {
        switch self {
        case .active: return true
        case .background, .suspended: return false
        }
    }
}

let state = AppState.active
print(state.isForeground()) // true

Пример со статическим методом (фабрика):

enum HTTPMethod: String {
    case get = "GET", post = "POST", put = "PUT"

    // Статический метод для создания из строки
    static func from(string: String) -> HTTPMethod? {
        return HTTPMethod(rawValue: string.uppercased())
    }
}

let method = HTTPMethod.from(string: "post") // .post

Расширенные возможности:

  • Мутирующие методы: Если метод изменяет self, его нужно пометить mutating.

    enum TrafficLight {
        case red, yellow, green
    
        mutating func next() {
            switch self {
            case .red: self = .green
            case .green: self = .yellow
            case .yellow: self = .red
            }
        }
    }
  • Доступ к ассоциированным значениям: Методы могут извлекать и использовать связанные данные.

Добавление методов позволяет инкапсулировать логику, связанную с перечислением, делая код более организованным и безопасным.