Ответ
Да, в 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, ты всю связанную с ним хуйню инкапсулируешь в одном месте. Код становится чище, надёжнее, и тебе не придётся потом, как мудаку, бегать и искать, где же эту логику размазали. Всё на своём месте, в рот меня чих-пых!