Собственный Optional удобно представить generic-enum с двумя состояниями: none и some(Value). Безопасное извлечение требует явного разбора состояния.
Создай собственный тип Optional
Собственный 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 имеет специальную поддержку компилятора.