В первом примере замыкание выполняется один раз, оно возвращает строку, и этой строке присваивается значение greeting
.Там нет закрытия;ничто не захвачено.Это просто анонимная функция.Если хотите, вы можете избавиться от self.
, как в названной функции.Ключевым моментом является то, что тип greeting
равен String
.
Во втором примере greeting
является значением замыкания, которое захватывает self
.Поскольку self
содержит greeting
, а greeting
содержит self
, существует цикл.Ключевым моментом является то, что тип greeting
равен () -> String
.Это почти наверняка ошибка, так как это не то, как lazy
предназначен для использования.
(lazy
- довольно странная особенность в Swift, и, вероятно, было плохой идеей включать в языкЯ стараюсь избегать этого, насколько это возможно. Есть несколько хитрых способов использовать его неправильно, поэтому неудивительно, что он укусил вас.)