Используете ли вы форс анрап в своих проектах
Что проверяют
Есть ли у вас осознанное правило, а не догма «никогда» или привычка «так быстрее». Следом обычно просят назвать случаи, где ! оправдан, и спрашивают, как это контролируется в команде.
Как отвечать
Сначала механика: ! извлекает значение из опционала, а при nil приложение падает с Unexpectedly found nil while unwrapping an Optional value. Это не исключение, перехватить его нельзя. Поэтому по умолчанию используют безопасные способы:
guard letиif let: основной вариант, с Swift 5.7 можно писать короче,guard let user else { return };??: значение по умолчанию, когда оно действительно имеет смысл;- опциональная цепочка:
user?.address?.cityбез промежуточных проверок; - в тестах:
try XCTUnwrap(value)илиtry #require(value)в Swift Testing. Тест упадёт с понятным сообщением, а не обрушит весь прогон.
Потом честно назовите исключения, где ! допустим, потому что nil означает ошибку программиста, а не данных:
@IBOutlet: объявляется как неявно развёрнутый опционал, связь проверяется при загрузке сториборда;- литералы:
URL(string: "https://example.com")!для строки, которую вы сами написали; - ресурсы бандла: файл, без которого приложение всё равно не работает.
Даже здесь сильнее выглядит guard let ... else { preconditionFailure("Нет config.json") }: краш придёт с понятным сообщением. В командах правило обычно закрепляют в SwiftLint (force_unwrapping, force_cast, force_try). Расскажите, как это устроено у вас, и приведите свой пример: где стоял ! и что его заменило. Если линтера в проекте не было, скажите прямо и объясните, как договаривались на ревью.
Где спотыкаются
Говорят «никогда не использую». Интервьюер тут же спросит про @IBOutlet, и ответ окажется неправдой.
Используют ! на данных из сети или из UserDefaults. Именно такие краши потом приходят в Crashlytics от реальных пользователей.
Прячут проблему через ?? "" или ?? 0. Краша нет, но на экране пустая строка или нулевая сумма, и ошибка всплывает позже и дальше от причины.