Замыкания — это автономные блоки функций, которые можно передавать и использовать в вашем коде. Это означает, что они представляют собой небольшие блоки кода, которые могут выполняться вместе в каком-либо другом классе или передаваться функции для выполнения там. также сохраняется. Использование @escaping указывает, что контекст замыкания должен быть сохранен даже после завершения выполнения функции, которой передается замыкание.
Итак, если вы все это поняли, история закрытия окончена. Теперь вы освоили это 😏.
Шучу, там так много всего и так много нужно принять.
Теперь, когда используется экранирующий атрибут параметра, мы используем сильные ссылки на класс, это вызывает цикл сохранения, и мы не можем этого допустить 🤫. Этого не произойдет, если закрытие будет недолгим.
Чтобы сломать это, мы используем слабые или бесхозные ссылки, и это предотвратит цикл сохранения. Однако это еще не все, если вы используете weak, вам придется обрабатывать необязательную развертку, для unowned это сложная обработка, о которой мне придется узнать больше и написать отдельную статью, и вместо всего этого мы можем пойти на более чистый захват список, который фиксирует переменные внутри замыкания и использует их. Здесь я кратко обсуждаю список захвата, который я упустил из виду в замыканиях и всегда придерживался использования слабого себя везде, где это необходимо 😅

Списки захвата:
они используются для захвата значений переменных для дальнейшего использования в замыкании. Это копии переменных, которые передаются замыканию, поэтому они не вызывают циклов сохранения.

Здесь mutableValue — это переменная, но поскольку она передается замыканию внутри списка захвата, ее значение не может быть изменено внутри замыкания.

Теперь, прежде чем продолжить, попробуйте эти два случая:
1. Создайте структуру и передайте ее в качестве аргумента. Затем измените его значение вне замыкания и проверьте напечатанное значение.
2. Проделайте вышеописанное с классом.

Здесь структура передается в замыкание, и замыкание вызывается после изменения значения структуры. struct является типом значения, поэтому список захвата зафиксировал значения структур, которые были ему переданы, и выходные данные здесь не изменятся.
Выходными данными будут Test.

Здесь класс передается в список захвата, и, поскольку это ссылочный тип, значение здесь изменится, и я также могу изменить образец значения класса в замыкании.

Это может не стать неожиданностью для большинства из вас, поскольку здесь замыкание захватывает только значение, потому что String в Swift является типом значения. Здесь значение mutableValue не изменяется в замыкании, поэтому печатается только «Тест локальной переменной списка захвата».

Это будет продолжено во второй части, где будет больше информации о замыканиях и немного о списках захвата.