iOS/🟠 Swift

[Swift] - defer λ¬Έμ΄λž€?

woozzang 2021. 4. 29. 17:36

μ„ μ–Έλœ λΈ”λ‘μ˜ 싀행을 μŠ€μ½”ν”„ μ’…λ£Œ μ§μ „κΉŒμ§€ μ—°κΈ°μ‹œν‚€λŠ” ν‚€μ›Œλ“œ

"호좜 μ‹œμ κ³Ό μ‹€ν–‰ μ‹œμ μ΄ λ‹€λ₯΄λ‹€"

 

μš©λ„ : 주둜 μ½”λ“œμ—μ„œ μ‚¬μš©ν–ˆλ˜ μžμ›μ„ 정리할 λ•Œ μ‚¬μš©ν•œλ‹€.

μ˜ˆμ‹œ) 파일 처리 μ—μ„œ 파일 λ‹«κΈ°

func processFile(path: String) {
    let file = FileHandle(forReadingAtPath: path)

    // Process

    if path.hasSuffic(".jpg") {
        return
        // closeFile()이 ν˜ΈμΆœλ˜μ§€ μ•ŠμŒ
    }

    file?.closeFile()

}

 

πŸ’‘ν•΄κ²°

defer λ¬Έ μ•ˆμ— closeFile 을 κ΅¬ν˜„ν•΄ λ†“μœΌλ©΄ ν•¨μˆ˜ λ°˜ν™˜ 직전에 싀행을 보μž₯ν•  수 μžˆλ‹€.

func processFile(path: String) {
    let file = FileHandle(forReadingAtPath: path)

    // Process

    defer {
    // μŠ€μ½”ν”„ μ’…λ£Œ μ‹œμ μœΌλ‘œ μ‹€ν–‰ μ—°κΈ°
        file?.closeFile()
    }

    if path.hasSuffic(".jpg") {
        return
    }
}

 

β—οΈμ£Όμ˜ν•  점

defer 문이 μš°μ„  ν˜ΈμΆœλ˜μ–΄μ•Ό μ’…λ£Œ μ‹œμ μ— 싀행될 수 μžˆλ‹€.

μ•„λž˜ μ½”λ“œλŠ” if λ¬Έ μ—μ„œ processFile(path:) κ°€ λ°˜ν™˜λ˜μ–΄, defer 문이 ν˜ΈμΆœλ˜μ§€ μ•ŠλŠ”λ‹€.

ν•΄κ²° : λ”°λΌμ„œ μ½”λ“œ 블둝 상단에 주둜 defer 문을 μ„ μ–Έν•΄λ†“λŠ”λ‹€. (μœ„μ˜ μ½”λ“œ μ°Έκ³ )

func processFile(path: String) {
    let file = FileHandle(forReadingAtPath: path)

    // Process

    if path.hasSuffic(".jpg") {
        return
    }

    // if λ¬Έμ—μ„œ μ’…λ£Œλ˜λ©΄ ν˜ΈμΆœλ˜μ§€ μ•Šμ„ 수 μžˆλ‹€.
    defer {
        file?.closeFile()
    }
}

 

🍯 μ—¬λŸ¬ 개의 defer 블둝 호좜 μˆœμ„œ

defer 문은 ν˜ΈμΆœλ˜λŠ” μˆœμ„œμ˜ μ—­μˆœμœΌλ‘œ μ‹€ν–‰λœλ‹€. LIFO 방식이라고 μƒκ°ν•˜λ©΄ 이해가 νŽΈν•˜λ‹€.

이와 같이 defer 문의 νŠΉμ§•μ„ μ΄ν•΄ν•˜μ§€ λͺ»ν•˜κ³  κ΅¬ν˜„ν•˜λ©΄ 논리적인 였λ₯˜κ°€ λ°œμƒν•  수 μžˆλ‹€.

 

κ·Έλž˜μ„œ 보톡 defer ν•˜λ‚˜μ— μ½”λ“œλ₯Ό λͺ¨μ•„ λ†“λŠ”λ‹€.

func deferTestFunction() {

    defer {
        print("1")
    }
    defer {
        print("2")
    }
    defer {
        print("3")
    }
}

deferTestFunction()
// prints "3" -> "2" -> "1"

 

 

 

끝!


πŸ€–πŸŸ’[우짱의 iOS λΈ”λ‘œκ·Έ]πŸ”΅πŸ’»

iOSλ₯Ό κ³΅λΆ€ν•˜λ©΄μ„œ 배운 λ‚΄μš©μ„ κΈ°λ‘ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.