Создай собственный тип Optional

Собственный Optional удобно представить generic-enum с двумя состояниями: none и some(Value). Безопасное извлечение требует явного разбора состояния.

Короткий ответ

Что ответить на собеседовании

Собственный Optional удобно представить generic-enum с двумя состояниями: none и some(Value). Безопасное извлечение требует явного разбора состояния.

Подробный разбор

Ответ с пояснениями

Условие

Напиши собственную реализацию механизма Optional, позволяющего безопасно оперировать с объектами, которые могут быть пустыми, без риска возникновения NullPointerException.

Ответ

Собственный Optional удобно представить generic-enum с двумя состояниями: none и some(Value). Безопасное извлечение требует явного разбора состояния.

enum Maybe<Value> {
    case none
    case some(Value)

    func map<Other>(_ transform: (Value) -> Other) -> Maybe<Other> {
        switch self {
        case .none: return .none
        case .some(let value): return .some(transform(value))
        }
    }
    func flatMap<Other>(_ transform: (Value) -> Maybe<Other>) -> Maybe<Other> {
        switch self {
        case .none: return .none
        case .some(let value): return transform(value)
        }
    }
    func value(or fallback: @autoclosure () -> Value) -> Value {
        switch self {
        case .none: return fallback()
        case .some(let value): return value
        }
    }
}

У такого типа нет force unwrap, который падал бы на пустом значении. Однако это не обещает отсутствие ошибок в пользовательском transform. Синтаксис ?., ! и литерал nil не появляется автоматически: языковой Optional имеет специальную поддержку компилятора.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее