В этой статье мы поговорим об @экранировании и неэкранировании в 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")

Если вы запустите этот код, вы заметите кое-что:

Наш код выполняется в том порядке, в котором мы его реализовали, и вуаля, это не экранирование.

Я ценю, что ты решил провести часть своего дня со мной. Надеюсь, что моя статья была для вас информативной и полезной.

Прощай, продолжай расти и учиться. Увидимся в следующем. ✌️

Не забудьте подписаться на меня в Твиттере, чтобы получать новые статьи:

https://twitter.com/codeWithMoses