В этой статье мы поговорим об @экранировании и неэкранировании в Swift, поймем основные различия и проверим пример кода для этого.
Термины «@escaping» и «non-escapeing» используются для описания замыканий в Swift.
Если вы не знаете, что такое замыкание:
Замыкание в Swift простыми словами — это блок кода, который мы можем передать в качестве параметра функции или присвоить переменной.
Побег
«экранирование замыкания» — это замыкание, переживающее любую функцию, в которой оно определено. Другими словами, мы используем @escaping для замыкания, которое будет выполнено позже. Самое известное использование @escaping — это вызов сетевого API, который может пережить саму функцию и занять какое-то время для завершения.
Пример этого был бы полезен для понимания этой теории:
Вы можете создать новую игровую площадку и скопировать этот код:
func performAsyncTask(completion: @escaping () -> Void) { DispatchQueue.global().async { // Simulating an asynchronous task Thread.sleep(forTimeInterval: 2.0) completion() // Calling the completion closure after the task is finished } }
В этом примере у нас есть функция с именем performAsyncTask, которая имитирует асинхронную задачу, которая займет 2 секунды.
Как вы видите здесь, у нас есть экранирующее закрытие, определенное как параметр, который будет запущен после завершения нашей асинхронной задачи.
Теперь действие и тестирование этого с
import Foundation // Escaping closure example func performAsyncTask(completion: @escaping () -> Void) { DispatchQueue.global().async { // Simulating an asynchronous task Thread.sleep(forTimeInterval: 2.0) completion() // Calling the completion closure after the task is finished } } // Testing the escaping closure print("Before async task") performAsyncTask { print("Async task completed") } print("After async task")
Как вы можете видеть здесь, мы только добавили print() и вызвали нашу функцию и передали (print("Асинхронная задача выполнена")) в качестве экранирующего замыкания.
Если вы запустите этот код, вы заметите кое-что:
Прежде чем асинхронная задача => будет напечатана правильно
After Async task =› печатается правильно, но, как вы видите, она выполняется до того, как мы экранируем замыкание.
Асинхронная задача выполнена => распечатывается через 2 секунды. Это означает, что наше замыкание было сохранено и запущено на более позднем этапе.
Идеальный! Надеюсь, вы уже поняли, что такое @escaping и что он делает, вы можете поиграть с этой функцией и добавить несколько секунд, выполнить дополнительный код и убедиться в этом сами.
Не убегающий
«закрытие без экранирования» — это замыкание, которое должно быть выполнено до возврата функции. По умолчанию любое переданное закрытие не экранируется. Следовательно, этот код может объяснить это.
Скопируйте и вставьте на свою игровую площадку и запустите:
// Non-escaping closure example func performSyncTask(completion: () -> Void) { // Performing a synchronous task print("Performing a synchronous task") completion() // Calling the completion closure immediately } // Testing the non-escaping closure print("Before sync task") performSyncTask { print("Sync task completed") } print("After sync task")
Если вы запустите этот код, вы заметите кое-что:
Наш код выполняется в том порядке, в котором мы его реализовали, и вуаля, это не экранирование.
Я ценю, что ты решил провести часть своего дня со мной. Надеюсь, что моя статья была для вас информативной и полезной.
Прощай, продолжай расти и учиться. Увидимся в следующем. ✌️
Не забудьте подписаться на меня в Твиттере, чтобы получать новые статьи: