⌨️ Language/swift

[Swift] Escaping Closure

hyebin (Helia) 2023. 5. 20. 13:47
λ°˜μ‘ν˜•

μ΄μŠ€μΌ€μ΄ν•‘ ν΄λ‘œμ €(Escaping Closure)

  • escaping ν΄λ‘œμ €λŠ” ν΄λ‘œμ €κ°€ ν•¨μˆ˜μ˜ 인자둜 전달됐을 λ•Œ, ν•¨μˆ˜μ˜ 싀행이 μ’…λ£Œλœ ν›„ μ‹€ν–‰λ˜λŠ” ν΄λ‘œμ €
  • νŒŒλΌλ―Έν„° νƒ€μž… μ•žμ— @escaping μ΄λΌλŠ” ν‚€μ›Œλ“œλ₯Ό λͺ…μ‹œν•΄μ•Ό 함
  • μ΄μŠ€μΌ€μ΄ν•‘ ν΄λ‘œμ €μ—μ„œλŠ” selfλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ–ΈκΈ‰ν•΄μ•Ό 함
  • μ΄μŠ€μΌ€μ΄ν•‘ ν΄λ‘œμ €κ°€ μ‚¬μš©λ˜λŠ” μ˜ˆλ‘œλŠ” λΉ„λ™κΈ°λ‘œ μ‹€ν–‰λ˜λŠ” HTTP Request CompletionHandler이 있음
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
    completionHandlers.append(completionHandler)
}

 

Non-Escaping Closure

  • ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 직접 μ‹€ν–‰ν•˜κΈ° μœ„ν•΄μ„œλ§Œ μ‚¬μš©
  • νŒŒλΌλ―Έν„°λ‘œ 받은 ν΄λ‘œμ €λ₯Ό λ³€μˆ˜λ‚˜ μƒμˆ˜μ— λŒ€μž…ν•  수 μ—†μŒ
    • Non-escaping ν΄λ‘œμ €κ°€ λ³€μˆ˜λ‚˜ μƒμˆ˜μ— ν• λ‹Ήλ˜λ©΄ ν΄λ‘œμ €κ°€ μ›λž˜ λ²”μœ„ λ°–μ—μ„œ μ €μž₯ 및 싀행될 수 μžˆμœΌλ―€λ‘œ μ˜ˆμƒν•˜μ§€ λͺ»ν•œ λ™μž‘ 및 λ©”λͺ¨λ¦¬ λˆ„μˆ˜ λ°œμƒ κ°€λŠ₯
func outer(closure: () -> ()) {  
    var i = closure // @escaping으둜 νƒ€μž… μΆ”λ‘œλ¨, 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•ŠμŒ
    var j: () -> () = closure // νƒ€μž… λͺ…μ‹œ, 였λ₯˜ λ°œμƒ
}
  • 쀑첩 ν•¨μˆ˜μ—μ„œ ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•  경우, μ€‘μ²©ν•¨μˆ˜λ₯Ό 리턴할 수 μ—†μŒ
func outer(closure: () -> ()) -> () -> () {
    func inner() {
        closure()
    }
    return inner
}
print(outer {
    print("1")
})

func outer() -> (){
    private func ii() {
        print(1)
    }
    return ii()
}

print(outer())
  • ν•¨μˆ˜μ˜ μ‹€ν–‰ 흐름을 νƒˆμΆœν•˜μ§€ μ•Šμ•„, ν•¨μˆ˜κ°€ μ’…λ£Œλ˜κΈ° μ „ 무쑰건 μ‹€ν–‰λ˜μ–΄μ•Ό 함

 

Non-Escaping Closure 와 Escaping Closure

  • 컴파일러의 νΌν¬λ¨ΌμŠ€μ™€ μ΅œμ ν™” λ•Œλ¬Έμ— escaping, non-escaping ν΄λ‘œμ €λ₯Ό λ‚˜λˆ μ„œ μ‚¬μš©
  • non-escaping ν΄λ‘œμ €λŠ” μ»΄νŒŒμΌλŸ¬κ°€ ν΄λ‘œμ €μ˜ 싀행이 μ–Έμ œ μ’…λ£Œλ˜λŠ”μ§€ μ•ŒκΈ° λ•Œλ¬Έμ—, λ•Œμ— 따라 ν΄λ‘œμ €μ—μ„œ μ‚¬μš©ν•˜λŠ” νŠΉμ • 객체에 λŒ€ν•œ retain, release λ“±μ˜ 처리λ₯Ό μƒλž΅ν•΄ 객체의 라이프싸이클(life-cycle)을 효율적으둜 관리 κ°€λŠ₯
  • esacping ν΄λ‘œμ €λŠ” ν•¨μˆ˜ λ°–μ—μ„œ μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— ν΄λ‘œμ €κ°€ ν•¨μˆ˜ λ°–μ—μ„œλ„ 적절히 μ‹€ν–‰λ˜λŠ” 것을 보μž₯ν•˜κΈ° μœ„ν•΄, ν΄λ‘œμ €μ—μ„œ μ‚¬μš©ν•˜λŠ” 객체에 λŒ€ν•œ 좔가적인 참쑰싸이클(reference cycles) 관리 등을 ν•΄μ€˜μ•Ό 함
    •  μ»΄νŒŒμΌλŸ¬μ˜ νΌν¬λ¨ΌμŠ€μ™€ μ΅œμ ν™”μ— 영ν–₯을 끼치기 λ•Œλ¬Έμ— Swiftμ—μ„œλŠ” ν•„μš”ν•  λ•Œλ§Œ escaping ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•˜λ„λ‘ ꡬ뢄
λ°˜μ‘ν˜•