Обнаружьте ошибки в представленном Swift‑фрагменте

Основные риски — неизвестная очередь callback, удержание контроллера и неясное время жизни сервиса. titleLabel здесь устанавливается до чтения, поэтому nil не гарантирован.

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

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

Основные риски — неизвестная очередь callback, удержание контроллера и неясное время жизни сервиса. titleLabel здесь устанавливается до чтения, поэтому nil не гарантирован.

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

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

Условие

В приведённом ниже примере класса‑контроллера есть несколько потенциальных проблем, связанных с использованием необязательных свойств и замыканиями. Найдите и опишите их.

class SomeViewController: UIViewController {
    private var titleLabel: UILabel!

    func printText(text: String) {
        Logging.log(text)
        titleLabel = createLabelAndConfigure()
    }

    func createLabelAndConfigure() -> UILabel {
        // считаем, что метод реализован
    }

    func performAction() {
        let service = SomeNetworkService()
        service.downloadObject { text in
            self.printText(text: text)
            self.titleLabel.text = text
        }
    }
}

Ответ

Основные риски — неизвестная очередь callback, удержание контроллера и неясное время жизни сервиса. titleLabel здесь устанавливается до чтения, поэтому nil не гарантирован.

Если completion приходит не на main thread, присваивание label и изменение его текста нужно перенести на главный actor/очередь. Захват self сильный; это может продлевать жизнь контроллера, но цикл удержания нельзя утверждать без реализации сервиса и его ссылок. Аналогично локальный service может отмениться при освобождении либо удерживаться задачей — контракт не показан. Label лучше создать один раз при настройке интерфейса. Показанный createLabelAndConfigure — оговорённая заглушка, а не основание игнорировать остальной анализ.

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

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

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

Подробнее