β¨οΈ 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 ν΄λ‘μ λ₯Ό μ¬μ©νλλ‘ κ΅¬λΆ
λ°μν