Ответ
Нет, не может. В 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-значения.
Ответ 18+ 🔞
Да ты послушай, какая дичь! Вот сидишь ты, пишешь на Swift, всё вроде по феншую, и тут — бац! Хочешь в enum и raw value запихнуть, и associated values прилепить к одному и тому же case. Так вот, блядь, нельзя! Ни хуя! Язык тебе этого не позволит, и точка. Это как пытаться одновременно ебать и сосать — архитектурно не предусмотрено, ёпта!
Смотри, в чём тут подвох, чтобы ты не ломал голову зря.
Raw Value — это типа как татуха на всю жизнь, константа примитивная. Задал раз — и всё, пиздец. Все экземпляры этого кейса будут с одной и той же циферкой или строкой.
enum NetworkError: Int {
case badRequest = 400 // Ну вот, пришил 400 намертво, как жопу к унитазу.
case unauthorized = 401
}
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 values — это уже контейнер, обёртка вокруг каких-то левых данных. Это как взять паспорт (raw value) и попытаться в него же впихнуть ещё и три чемодана (associated values). Не, ну ты попробуй, конечно, но паспорт порвётся, и пограничники тебя нахуй пошлют. Вот и Swift так же — он просто не даст скомпилировать эту хуйню, чтобы ты себе и другим жизнь не усложнял. Чистая архитектура, блядь!