iOS/iOS

defer

황민우 2022. 3. 18. 21:38

defer?

- 현재 코드 블록을 빠져나가기 전에 꼭 실행해야 되는 코드를 작성하여 코드가 블록을 빠져나가기 전에 꼭 실행시키게 하는 문법

- 작성된 위치와 상관없이 함수 종료 직전에 실행되는 구문


예제

func test() {
    print("Test 1")
    
    defer {
        print("Test defer")
    }
    print("Test 2")
}

test()

// 실행결과
// Test 1
// Test 2
// Test defer

 

예제2 : defer의 실행 순서

- defer 구문끼리의 순서는 역순으로 실행됩니다.

func test() {
    print("Test")
    defer {  print("Test defer1") }
    defer {  print("Test defer2") }
    defer {  print("Test defer3") }
    defer {  print("Test defer4") }
    print("Test 5")    
}

test()

// 실행 결과
// Test
// Test 5
// Test defer4
// Test defer3
// Test defer2
// Test defer1

defer가 호출되지 않는 경우

 

1, throw를 이용해 오류를 던질 경우

func test(isError: Bool) throws -> Void {
    defer{
        print("test1")
    }
    
    if isError{
        enum TestError: Error{
            case error
        }
        throw TestError.error
    }
    
    defer{
        print("test2")
    }
    
    print("test3")
}

print("== Error True==")
try? test(isError: true)
print("== Error False==")
try? test(isError: false)

// 실행 결과
// == Error True==
// test1
// == Error False==
// test3
// test2
// test1

 

2, guard문을 사용하여 중간에 함수를 종료하는 경우

func test(string: String?){
    defer {
        print("test 1")
    }

    guard let str = string else {
        return
    }

    defer {
        print("test 2")
    }

    print("test 3")
}

print("==string nil==")
test(string: nil)
print("==string not nil==")
test(string: "test")

// 실행 결과
// ==string nil==
// test 1
// ==string not nil==
// test 3
// test 2
// test 1

 

3, 리턴 값이 Never(비 반환 함수)인 경우

- 에러가 발생하며 실행이 종료됩니다. (defer는 호출 X)

func test() -> Never {
    defer {
        print("test 1")
    }

    defer {
        print("test 2")
    }

    defer {
        print("test 3")
    }

    abort()
}

내용 출처

https://swieeft.github.io/2020/02/26/defer.html

 

defer 구문 알아보기 - 뀔뀔(swieeft)의 개발새발기

안녕하세요. 오늘은 defer 구문을 알아보려고 합니다. defer는 제가 면접을 보러 다니면서 자주 접했던 Swift 문법 질문으로, 내용은 쉽지만 우리가 놓치고 넘어가기 쉬운 문법 중 하나 입니다. 실제

swieeft.github.io

https://babbab2.tistory.com/80

 

Swift) defer를 알아보자

안녕하세요 :) 소들입니다 오늘은 Swift의 문법 중 defer라는 것에 대해 공부를 해보려고 합니다~~!!! 간단한 내용이고, 어렵지 않아요!! 모든 포스팅은 편의 말투로 합니다~!! 1. defer가 뭘까 자, 먼저

babbab2.tistory.com