- Published on
π Swift - ν΄λ‘μ (Closure).03
- Authors
- Name
- μ΄μ°½μ€
μ΄λ²μλ @autoclosure
μ @escaping
μ λν΄ μμλ³΄κ² μ΅λλ€.
@autoclosure
autoclosureλ μ°μ μ©μ΄ μ체λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
μλ-ν΄λ‘μ ?
μ΄κ² λ체 λκΉμ?
μ΄λ²μλ μ μλ₯Ό μ΄ν΄λ΄ μλ€.
μΈμλ‘μ μ λ¬λ μΌλ°κ΅¬λ¬Έ/ν¨μλ₯Ό ν΄λ‘μ λ‘μ κ°μΈλ κ²
μ무λλ μΌλ°κ΅¬λ¬Έ/ν¨μλ₯Ό μλμΌλ‘ ν΄λ‘μ λ‘μ μ·¨κΈνλ€.. λΌλ μλ―ΈμΈ κ² κ°λ€μ.
μμ§λ μ΄ν΄κ° μ κ°μ§ μμΌλ μμ λ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
func foo(closure: @autoclosure () -> ()) {
// Tasks
}
@autoclosure
κ° μ¬μ©λλ μμΉλ μ κΈ°μ΅ν΄μ£ΌμΈμ. μΈμλͺ
λ€ νμ
μ μ λ°λ‘ μμ μμΉν΄μμ΅λλ€!
μ κ·Έλμ λ체 μ΄κ² 무μ¨λ§μ΄λ..
@autoclosure λ₯Ό μ¬μ©νλ©΄ ν΄λ‘μ νμ μ μΈμ closureλ ν΄λ‘μ κ° μλ μΌλ°κ΅¬λ¬Έ/ν¨μλ₯Ό λ°μλ ν΄λ‘μ λ‘μ μ²λ¦¬ν΄μ€λλ€.
μ°μ @autoclosureλ₯Ό μ¬μ©νμ§ μμμ λλ₯Ό λ΄ μλ€.
func foo(_ closure: () -> Void) {
closure()
}
μ ν¨μλ₯Ό νΈμΆν λ μ΄λ»κ² νΈμΆν κΉμ? μλμ κ°μ΄ νΈμΆν©λλ€.
foo({
print("Hi! I'm Closure")
})
μ΄λ²μ κ°μ ν¨μμ @autoclosureλ₯Ό μ¬μ©ν΄λ΄ μλ€.
func foo(_ closure: @autoclosure () -> Void) {
closure()
}
μ ν¨μλ μλμ²λΌ νΈμΆλ©λλ€.
foo(print("Hi! I'm Closure"))
{ β¦ }
μ΄ μ€κ΄νΈκ° μμ΄μ§ κ²μ λ³Ό μ μμ£ .
ν΄λ‘μ λ λ³ΈμΈμ΄ ν΄λ‘μ μμ μ리기 μν΄ μ€κ΄νΈκ° 무쑰건 νμν©λλ€. @autoclosureλ ν΄λ‘μ κ° μλ μΌλ°κ΅¬λ¬Έ/ν¨μλ₯Ό μ€κ΄νΈλ‘ κ°μΌ μν μ ν΄μ£Όλ κ²μ΄μ£ .
λ¨ μ μν μ μ @autoclosureλ₯Ό μ¬μ©νκΈ° μν΄μλ ν΄λ‘μ μ μΈμκ° μμ΄μΌ ν©λλ€!
func foo(closure: @autoclosure (Int) -> Void) {
closure()
}
μμ κ²½μ° (Int) -> Void
μΈμλ‘ Int νμ
μ΄ λ€μ΄κ°μμ£ ?
λ°λΌμ μ€λ₯κ° λ©λλ€. κΌ μ£Όμν΄μ£ΌμΈμ!
κ·Έλ λ€λ©΄ μΌλ°κ΅¬λ¬Έμ λΉν΄μ @autoclosureμ μ¬μ©νμ λμ μ°¨μ΄μ μ 무μμΌκΉμ?
μΌλ°κ΅¬λ¬Έμ μλ μ€ν μμκ° λλ©΄ μ¦μ μ€νλ©λλ€.
μ§μ°μ μ€λ€κ³ νλλΌλ μ§μ°μ μ£Όλ ν¨μκ° μ¦μ μ€νλμκΈ° λλ¬Έμ λ€μ λ°λΌμ€λ λ€λ₯Έ ν¨μλ€μ΄ μ§μ°λλ κ²μ΄μ£ .
κ·Έλ°λ° ν΄λ‘μ λ μ¦μ μ€νλμ§ μμ΅λλ€. ν¨μ μμμ ν΄λΉ μΈμκ° μ¬μ©λ λ μ€νλμ£ .
κ²°λ‘ μ μΌλ‘ @escapingμ μΌλ°κ΅¬λ¬Έμ ν΄λ‘μ μ²λΌ μ¬μ©νκ³ μΆμ λ μ μ©ν κΈ°λ₯μ λλ€.
@escaping
@escaping
ν΄λ‘μ λ μ©μ΄μ μ΄λ¦μμ μ μΆν μ μλ―μ΄, ν¨μμμ λ²μ΄λμλ μ€νλ μ μλ ν΄λ‘μ μ
λλ€.
@escaping
ν΄λ‘μ λ₯Ό μ¬μ©νλ©΄ λ€μκ³Ό κ°μ κΈ°λ₯μ μ¬μ©ν μ μμ΅λλ€.
ν¨μκ° λλ λ€μλ μ€νλ μ μλ€. μ€μ²©ν¨μμμ μ€μ²©ν¨μλ₯Ό return ν μ μλ€. λ³μ/μμμ ν΄λ‘μ λ₯Ό λμ ν μ μλ€. μ΄ λ§μ μ§κΈκΉμ§ λ€λ€λ ν΄λ‘μ λ€μ μμ κ²½μ°λ€μ΄ μ λΆ λΆκ°λ₯νλ€λ μλ¦¬κ² μ£ ?
μ§κΈκΉμ§ λ€λ€μ¨ ν΄λ‘μ λ€ κ°μ΄ @escaping ꡬ문μ μ¬μ©νμ§ μμ ν΄λ‘μ λ€μ non-escaping closureλΌκ³ λΆλ¦ λλ€.
API λΌμ΄λΈλ¬λ¦¬μΈ Alamofireμ μμλ₯Ό λ³΄κ² μ΅λλ€.
func dataGET(from url: URL, completion: @escaping (AnyObject) -> ()) {
DispatchQueue.global(qos: .background).async {
Alamofire.request(url, method: .get).responseObject { (response: DataResponse<FilmResponse>) in
switch response.result {
case .success(_):
let res = response.result.value
let resURL = res.results.imageID
print(resURL ?? "No URL Found")
case .failure(let error):
print(error)
}}
}
}
κ΅μ₯ν 볡μ‘ν΄λ³΄μ΄μ£ ? μ¬μ€ λ€λ₯Έκ±΄ λ€ νμμμ΅λλ€.
func dateGET(from url: URL, completion: @escaping (AnyObject) -> ()) {
DispatchQueue.global(qos: .background).async {
// Blah Blah
}
}
μ΄λ κ²λ§ 보면 λ©λλ€.
μ΄μ μ°λ¦¬λ μ ν¨μλ₯Ό λΆμν μ μμ΅λλ€!
λ§μ§λ§ μΈμλ‘ closureλ₯Ό μ¬μ©νμ¬ Trailing Closure λ°©μμ΄ μ±νλμλ€μ. λ, @escaping
ν΄λ‘μ κ° μ¬μ©λ κ²λ λ³Ό μ μμ΅λλ€. μ μ¬μ©νμκΉμ?
API νΈμΆμ μλμ μΌλ‘ λ§μ μκ°μ΄ μμλ©λλ€. κ·Έλμ λ³΄ν΅ λΉλκΈ°μ±μΌλ‘ μ€ννμ£ . μ μ κ° λ‘λ©μ΄ λ€ λ λκΉμ§ λ¨Ήν΅μ΄ λ μ±μ κ°λ§ν λ³΄κ³ μμ§ μμν λκΉμ.
λ°λΌμ μ ν¨μκ° μλ£λκΈ° μ μ DispatchQueue
λ‘ μ€νν ꡬ문λ€μ μλ£λμμ κ°λ₯μ±μ΄ κ±°μ μ 무ν©λλ€. μ¬κΈ°μ @escaping ν΄λ‘μ κ° μλλΌ non-escaping ν΄λ‘μ λ₯Ό μ¬μ©νλ€λ©΄..? ν¨μκ° μ’
λ£λ¨κ³Ό λμμ ν¨μ μμμ μ€νλ ν΄λ‘μ κΉμ§ μ λΆ μ’
λ£λμ΄ λ²λ¦½λλ€. μ ν¬κ° μνλ κ²°κ³Όλ μ λ μλμ£ .
κ·Έλ¦¬κ³ μ μ΄μ XCodeμμ μ΄λ₯Ό νμ©νμ§ μμ΅λλ€.
Warning: Escaping closure captures non-escaping parameter
λΌλ μλ¬ λ©μμ§λ₯Ό μΆλ ₯νλ©° λΉλ μλ¬κ° λμ£ .
μ΄λ κ² @autoclosure
μ @escaping
ν΄λ‘μ κΉμ§ μμλ΄€μ΅λλ€. @escaping ν΄λ‘μ λ μ¨λΌμΈμΌλ‘ ν΅μ νλ μ±μμλ κ±°μ νμμ μΌλ‘ μ¬μ©λ²μ μμλ¬μΌ νλ κΌΌκΌΌνκ² κΈ°μ΅ν΄λ νμκ° μμ΅λλ€. μ μ²λΌ ν€λ§€μ§ μμΌλ €λ©΄ λ§μ΄μ£ γ
γ