Может ли инициализатор в Swift возвращать опциональный экземпляр?

«Может ли инициализатор в Swift возвращать опциональный экземпляр?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, для этого используются Failable Initializers (проваливающиеся инициализаторы). Они помечаются знаком ? после init и возвращают опциональное значение типа Type?.

Синтаксис и пример:

struct Temperature {
    let celsius: Double

    // Проваливающийся инициализатор
    init?(celsius: Double) {
        guard celsius >= -273.15 else {
            return nil // Невозможно создать объект при температуре ниже абсолютного нуля
        }
        self.celsius = celsius
    }
}

let validTemp = Temperature(celsius: 25) // Temperature?
let invalidTemp = Temperature(celsius: -300) // nil

Ключевые моменты:

  1. Используйте init? для обозначения проваливающегося инициализатора.
  2. Возвращайте nil в случае неудачи (невалидные параметры, отсутствие ресурсов).
  3. Неявно разворачиваемый проваливающийся инициализатор (init!) существует, но его использование рискованно, так как при возврате nil приведет к крашу при обращении.

Практическое применение: Валидация входных данных, загрузка ресурсов (изображений, данных), декодирование.