defer 란 사전적 정의로는 연기하다, 지연되다, 미루다 이다.
함수 안에서 주로 사용되며 작성된 위치와 관계없이 함수종료 직전에 실행 된다.
defer 내부에 작성된 코드들이 함수 끝나기 직전에 행 해진다는 뜻이다.
어렵지 않다 defer 키워드를 사용하고 중괄호를 열어 내부를 작성하고 중괄호를 닫으면 완성이다!
func f() {
defer { print("First defer") }
print("End of function")
}
f()
// Prints "End of function"
// Prints "First defer"
기존 함수의 사이클이라면 함수f를 호출하게되면
"First defer"
"Second defer"
End of function"
순으로 출력되어야 할것인데 defer 를 사용했기 때문에 순서가 바뀌게되었다.
이것 외에도 다른 특징이 있다.
defer 는 여러번 호출이 가능하며 중첩도 가능하다.
stack 과 같은 방식으로 저장된다고 생각하면 이해가 좀 더 편하다.
func f() {
defer { print("First defer") }
defer { print("Second defer") }
print("End of function")
}
f()
// Prints "End of function"
// Prints "Second defer"
// Prints "First defer"
마지막에 defer 가 가장 먼저 실행 된다.
처음 defer 가 가장 마지막에 실행 된다.
중첩에서도 위와 같다.
가장 바깥쪽에 있는 defer 가 가장 먼저 실행되고
가장 안쪽에 있는 defer 가 마지막에 실행된다.
func f() {
defer {
defer {
print("First defer")
}
print("Second defer")
}
}
f()
// Prints "Second defer"
// Prints "First defer"
함수 내부에서 defer 구문이 실행되기전에 함수가 종료되면 defer 구문은 실행되지 않는다.
func f() {
print("End of function")
return
defer { print("First defer") }
defer { print("Second defer") }
}
f()
// Prints "End of function"
반환값이 있는 함수에서의 사용
defer 를 사용하면 return 이후에 defer 구문을 실행하게된다.
func f() -> String? {
var malrang: String? = "malrang"
defer {
malrang = nil
}
return malrang
}
print(f())
// "malrang"
분명 함수내부에서 malrang 에 nil 을 넣어줬는데
return 반환 값은 "malrang" 이다
defer 구문은 return 이후에 실행되는것을 알수있다!