Обнаружение багов в Swift‑коде

greetings2 и greetings3 не компилируются: self у структуры после [self] не optional, поэтому self?.name недопустимо. greetings1 корректен.

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

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

greetings2 и greetings3 не компилируются: self у структуры после [self] не optional, поэтому self?.name недопустимо. greetings1 корректен.

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

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

Условие

В данном фрагменте Swift‑кода требуется найти и объяснить ошибки.

struct Person {
    let name:String
    func greetings1(){
        { [self] in
            print("Hello,\(self.name)")
        }()
    }
    func greetings2(){
        { [self] in
            print("Hello,\(self?.name)!")
        }()
    }
    func greetings3(){
        { [self] in
            print("Hello,\(self?.name)!")
        }()
    }
}

Ответ

greetings2 и greetings3 не компилируются: self у структуры после [self] не optional, поэтому self?.name недопустимо. greetings1 корректен.

Capture list [self] сохраняет значение Person и не превращает его в слабую optional-ссылку. Для всех трёх методов достаточно print("Hello,\(self.name)") внутри closure или обычного прямого print. Символ ! после закрывающей скобки интерполяции — часть печатаемой строки, а не force unwrap. Weak/unowned нельзя применить к значению структуры так же, как к экземпляру класса; в этом примере retain cycle отсутствует.

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

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

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

Подробнее