defer는 코드 블록을 나중에 실행되도록 지연시키는 역할로 defer 블록 내의 코드는 실행을 연기하고, 해당 블록이 속한 스코프를 빠져나갈 때 실행됩니다.
즉, defer 블록은 함수가 반환되기 전에 실행됩니다.
아래의 예제를 통해 defer의 실행 순서에 대해 알아보겠습니다.
func deferTest() {
print("~~~~~ Start ~~~~~")
defer {
print("defer #1")
}
print("<===== End =====>")
}

이 코드에서 defer 블록 안의 내용은 함수가 종료(반환) 되기 전에 실행되는 것을 볼 수 있습니다.
func deferTest() {
defer {
print("defer #1")
}
print("~~~~~ Start ~~~~~")
print("<===== End =====>")
}
func deferTest() {
print("~~~~~ Start ~~~~~")
return
defer {
print("defer #1")
}
print("<===== End =====>")
}

defer는 주로 파일 핸들이나 네트워크 연결과 같은 리소스를 정리하는 데 사용되며, 코드의 가독성을 높이고 코드의 마지막 부분에서 필요한 작업을 처리하는 데 사용됩니다.
func loadData() {
Task {
do {
process(action: .loading(true))
let response = try await NetworkManager.shared.getProductDetailData()
process(action: .getDataSuccess(response))
process(action: .loading(false))
} catch {
process(action: .getDataFailure(error))
process(action: .loading(false))
}
}
}
func loadData() {
Task {
defer {
process(action: .loading(false))
}
do {
process(action: .loading(true))
let response = try await NetworkManager.shared.getProductDetailData()
process(action: .getDataSuccess(response))
} catch {
process(action: .getDataFailure(error))
}
}
}