Можно ли реализовать кастомный аналог типа Optional в Swift?

Ответ

Да, можно создать свой тип, аналогичный Optional. Для этого используется enum с двумя случаями, как и у встроенного типа.

Базовая реализация:

enum MyOptional<Wrapped> {
    case some(Wrapped)
    case none

    // Аналог map для Optional
    func map<U>(_ transform: (Wrapped) -> U) -> MyOptional<U> {
        switch self {
        case .some(let value): 
            return .some(transform(value))
        case .none: 
            return .none
        }
    }

    // Аналог flatMap
    func flatMap<U>(_ transform: (Wrapped) -> MyOptional<U>) -> MyOptional<U> {
        switch self {
        case .some(let value): 
            return transform(value)
        case .none: 
            return .none
        }
    }
}

Особенности кастомной реализации:

  1. Generic-тип Wrapped позволяет хранить любое значение.
  2. Реализация основных методовmap, flatMap, filter.
  3. Синтаксический сахар можно добавить через расширения (например, инициализатор для неявного обертывания).
  4. Нет специальной поддержки компилятора — встроенный Optional имеет оптимизации и синтаксис (?, !), недоступные для пользовательских типов.

Пример использования:

let myValue: MyOptional<Int> = .some(10)
let squared = myValue.map { $0 * $0 } // .some(100)

let empty: MyOptional<Int> = .none
let result = empty.map { $0 * 2 } // .none