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

Ответ

Да, в 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
            }
        }
    }
  • Доступ к ассоциированным значениям: Методы могут извлекать и использовать связанные данные.

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

Ответ 18+ 🔞

Ну ты смотри, какой подвох-то! В Swift эти ваши enum'ы — это не просто тупые наборы циферок или строк, как в других языках, где они как сироты казанские. Нет, блядь! Это полноценные типы, с которыми можно вытворять такое, что мама не горюй! И самое главное — к ним можно методы цеплять, как банный лист к жопе. И экземплярные, и статические. Вот это поворот, ёпта!

Смотри, как методы к экземпляру прилепить:

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

Во, представляешь? Кидаешь ему какую-то левую строку, а он тебе, хитрая жопа, пытается из неё метод сделать. Не получится — вернёт nil, и ты не обосрёшься с кривыми данными. Удобно, блядь!

Но и это ещё не всё, овердохуища возможностей!

  • Мутирующие методы: Если метод собрался 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
            }
        }
    }

    Светофор переключается сам в себе, красота! Сказал next() — и поехали.

  • Доступ к ассоциированным значениям: А если внутри кейсов данные лежат, так методы могут их вытащить и по-всякому использовать. Никаких тебе if case let снаружи, вся логика внутри, как в бункере.

Короче, добавляя методы в enum, ты всю связанную с ним хуйню инкапсулируешь в одном месте. Код становится чище, надёжнее, и тебе не придётся потом, как мудаку, бегать и искать, где же эту логику размазали. Всё на своём месте, в рот меня чих-пых!