[ Swift ] defer의 실행 순서

이숭인·2021년 9월 23일
0

[ Swift ]

목록 보기
12/13

defer 란?

현재 코드 블록을 나가기 전에 꼭 실행해야 되는 코드


func test() {
    defer {
        print("test function end")
    }

    print("Hello world")
}

defer의 호출 순서는 역순!



defer 가 호출되지 않는 경우


throw를 이용해서 오류를 던질 경우

func test(isError: Bool) throws -> Void{
    defer {
        print("test 1")
    }

    if isError {
        enum TestError: Error {
            case error
        }

        throw TestError.error
    }

    defer {
        print("test 2")
    }

    print("test 3")
}

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

실행 결과


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("\n==string not nil==")
test(string: "test")

실행 결과


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

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

    defer {
        print("test 2")
    }

    defer {
        print("test 3")
    }

    abort()
}

실행 결과

에러가 발생하면서 함수를 반환하지 않고 실행을 종료하기 때문에 defer가 호출되지 않는다!

profile
iOS Developer

0개의 댓글