Так что будьте осторожны с этим!

Я ранее писал о defer, который используется в Swift для очистки ресурсов перед выходом из заданной области. Что приятно.

Да, еще есть видео, которое вы могли бы посмотреть именно на эту тему: https://youtu.be/Ni-sApIsNM8

Однако кажется, что defer работает в обратном порядке, в том порядке, в котором он действительно должен (спойлер: если мы думаем о defer как о стеке, это совсем не наоборот и имеет смысл).

Тем не менее, давайте посмотрим, как работает defer, на довольно простом примере:

func testDefer() {
    defer {print("Do this at the end")}
    print("Do some stuff")
}
testDefer()

Это дает нам следующий результат:

Do some stuff
Do this at the end

Что, конечно же, откладывает выполнение оператора print(“Do this at the end”) до момента, когда мы выходим из области действия этой функции. Довольно замечательно.

Так что, если у нас есть несколько операторов defer в функции? Конечно, это не может быть так сложно, правда?

Оказывается, может.

func testDefer() {
    defer {print ("Do this at the end")}
    defer {print ("Do this right at the end")}
    print("Do some stuff")
}
testDefer()

Теперь происходит то, что первый оператор defer будет последним, что делается перед выходом из области видимости, а второй оператор будет предпоследним делом, которое будет сделано.

Это дает нам следующий результат:

Do some stuff
Do this right at the end
Do this at the end

То, что сделано в конце, находится в самом конце, а не то, что сделано в конце. Правильно?

Вывод

Defer на самом деле прекрасный способ написания ясного и легкого для понимания кода. Теперь вам просто нужно это понять, правда?

Спасибо, что прочитали эту статью, и я надеюсь, что вы что-то поняли!

Если у вас есть вопросы, комментарии или предложения, пишите мне в Twitter.