Ответ
Да, для этого используются 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
Ключевые моменты:
- Используйте
init?для обозначения проваливающегося инициализатора. - Возвращайте
nilв случае неудачи (невалидные параметры, отсутствие ресурсов). - Неявно разворачиваемый проваливающийся инициализатор (
init!) существует, но его использование рискованно, так как при возвратеnilприведет к крашу при обращении.
Практическое применение: Валидация входных данных, загрузка ресурсов (изображений, данных), декодирование.