greetings2 и greetings3 не компилируются: self у структуры после [self] не optional, поэтому self?.name недопустимо. greetings1 корректен.
Обнаружение багов в Swift‑коде
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 отсутствует.