μ΅κ·Όμ iOS μ€ν°λ μΉκ΅¬λ€κ³Ό ν¨κ» ν΄λ‘μ μ λν΄ κ³΅λΆν΄λ³΄μλλ°μ,
λΈλ‘κ·Έμλ κ·Έ λ΄μ©μ νλ² μ 리ν΄λ³΄λ €κ³ ν©λλ€!π
λ°μ΄ν° μ λ¬, μλ² ν΅μ λ± λ€μν μν©μμ μ μ©νκ² μ΄μ©κ°λ₯ν ν΄λ‘μ μ λν΄ μμλ΄ μλ€!!
ν΄λ‘μ (Closure)λ?
ν΄λ‘μ λ μΌμ κΈ°λ₯μ νλ μ½λλ₯Ό νλμ λΈλ‘μΌλ‘ λͺ¨μλμ κ²μ λ§ν©λλ€.
μ€νκ°λ₯ν μ½λλΈλμ΄λΌκ³ λ ν μ μμ΅λλ€.
ν¨μλ ν΄λ‘μ μ ν ννμ λλ€. (ν¨μλ μ΄λ¦μ΄ μλ ν΄λ‘μ )
ν΄λ‘μ λΌλ κ°λ μμ ν¨μκ° ν¬ν¨λλ κ²μ΄λΌκ³ ν μ μμ΅λλ€.
→ ν¨μ: Named Closure, μ΄μΈμ μΌλ°μ μΈ ν΄λ‘μ : (Unnamed) Closure
ν΄λ‘μ λ μΌκΈκ°μ²΄μ νΉμ±μ κ°μ§κ³ μμ΅λλ€.
κ·Έλ κΈ° λλ¬Έμ λ³μλ μμμ λμ νκ³ , λ°ν(return) κ°λ₯νλ©° νλΌλ―Έν°λ‘ λ°μ μ μμ΅λλ€.
μ¦, μ λ¬μΈμ, λ³μ, μμ λ±μ μ μ₯ λ° μ λ¬μ΄ κ°λ₯νλ€λ λ»μ λλ€!
ν¨μμ λ€λ₯΄κ² μ΄λ¦μ μκ° νμνμ§λ μμ§λ§, 맀κ°λ³μ μ λ¬κ³Ό λ°ν κ°μ΄ μ‘΄μ¬ν μ μλ€λ μ μ΄ λμΌν©λλ€.
ν΄λ‘μ . κ·Έκ±° μ΄λ»κ² μ°λ건λ°..
ν΄λ‘μ ννμ
{ (맀κ°λ³μ λͺ©λ‘) -> ReturnType in // closure head
μ€νμ½λ(body) // closure body
}
- -> μ μ΄μ©ν΄ λ°ν νμ μ λͺ μν©λλ€.
- ν΄λ‘μ ν€λμ ν΄λ‘μ λ°λλ₯Ό ꡬλΆμ§μ΄μ£Όλ κ²μ΄ in ν€μλ!
νμ§λ§ μ΄λ κ²λ§ λ΄μλ μ΄λ»κ² μ¬μ©νλμ§ μμ§ κ°μ΄ μ μμ€μ£ ? μ λμ¬..γ
μ€μ λ‘ μ΄λ»κ² μ¬μ©νλμ§ μ¬μ© μμλ€μ 보면μ μ΄ν΄ν΄λ΄ μλ€!
κΈ°λ³Έ ν΄λ‘μ
- νλΌλ―Έν°μ 리ν΄νμ μ΄ μλ ν΄λ‘μ
- νλΌλ―Έν°μ 리ν΄νμ λλ€ μλ ν΄λ‘μ
1. νλΌλ―Έν°μ 리ν΄νμ μ΄ μλ ν΄λ‘μ
μμμ ν΄λ‘μ λ μΌκΈκ°μ²΄λΌκ³ νμ Έ?
μ΄λ₯Ό μ½κ² λ§νλ©΄ ν΄λ‘μ λ μ΄λ¦μ΄ μλ ν¨μμ λλ€!
κ·Έλ κΈ° λλ¬Έμ μλμ κ°μ΄ μμμ ν΄λ‘μ λ₯Ό λμ ν μ μμ΅λλ€.
let closure = { (name: String) -> String in
return "Hello, \(name)"
}
But, μ¬κΈ°μ νκ°μ§ μ£Όμν μ μ!! μ΄λ κ² ν΄λ‘μ λ₯Ό λμ ν μμλ₯Ό νΈμΆν λ μ λλ€.
closure("jane")
closure(name: "jane") // μ΄λ κ² μ°λ©΄ μλ¬λ©λλ€
μμ κ°μ΄ ν΄λ‘μ λ₯Ό νΈμΆν λλ Argument Labelμ μ¬μ©νμ§ μμ΅λλ€.
μ¦, 'name'μ μ€μ§ Parameter NameμΌλ‘λ§ μ¬μ©λλ κ²μ λλ€!
2. νλΌλ―Έν°μ 리ν΄νμ λλ€ μλ ν΄λ‘μ
νλΌλ―Έν°μ 리ν΄νμ μ΄ λλ€ μλ κ²½μ°μλ μλ κ² μΈ μ μμ΅λλ€.
let closure = { () -> () in
print("Closure")
}
Swiftμμ ν¨μλ 리ν΄νμ μ΄ μμΌλ©΄ μλ΅μ΄ κ°λ₯νμ Έ?
ν΄λ‘μ λ λ§μ°¬κ°μ§λ‘ μλ΅μ΄ κ°λ₯ν©λλ€.
κ·Όλ°!!! ν΄λ‘μ λ 리ν΄νμ μ΄ μμ΄λ μλ΅μ΄ κ°λ₯ν©λλ€.
μ΄λ₯Ό μμμ λ°ν ννμ΄λΌκ³ νλλ°,
ν΄λ‘μ κ° λ°ννλ κ°μ΄ μλ€λ©΄ ν΄λ‘μ μ λ§μ§λ§ μ€μ κ²°κ³Όκ°μ
return ν€μλλ₯Ό μλ΅νλλΌλ μμμ μΌλ‘ λ°νκ°μΌλ‘ μ·¨κΈν©λλ€.
ν΄λ‘μ μμ 'μλ΅'μ ν΄λΉνλ κ²½λ λ¬Έλ²μ λν΄μλ λ€μμ λ λ€λ£¨λλ‘ νκ² μ΅λλ€!
ν΄λ‘μ , μ΄λ»κ² μ°λμ§ μ‘°κΈμ© κ°μ΄ μ‘νλμ?
κ·Έλ λ€λ©΄ ν΄λ‘μ μ κ°μ₯ μ€μν νΉμ§μ΄λΌκ³ ν μ μλ μΌκΈκ°μ²΄μ νΉμ§μ λν΄ μ 리ν΄λ΄ μλ€.
μΌκΈκ°μ²΄λ‘μ ν΄λ‘μ
- ν΄λ‘μ λ₯Ό λ³μ, μμμ λμ κ°λ₯
- ν¨μμ νλΌλ―Έν° νμ μΌλ‘ ν΄λ‘μ λ₯Ό μ λ¬ κ°λ₯
- ν¨μμ λ°ν νμ μΌλ‘ ν΄λ‘μ λ₯Ό μ¬μ©κ°λ₯
1. ν΄λ‘μ λ₯Ό λ³μ, μμμ λμ κ°λ₯
μμμ μ€λͺ νλ―μ΄ ν΄λ‘μ λ₯Ό λ³μλ μμμ λμ ν μ μμ΅λλ€.
ν΄λ‘μ λ₯Ό μ μΈν¨κ³Ό λμμ λ³μ or μμμ λμ ν μ μμΌλ©°,
κΈ°μ‘΄μ ν΄λ‘μ λ₯Ό λμ ν λ³μλ μμλ₯Ό μλ‘μ΄ λ³μλ μμμ λμ νλ κ²λ λΉμ°ν κ°λ₯ν©λλ€!
// ν΄λ‘μ μ μΈκ³Ό λμμ λμ
let closure = { () -> () in
print("Closure")
}
// μλ‘μ΄ λ³μλ μμμ λμ
λ κ°λ₯
let closure2 = closure
2. ν¨μμ νλΌλ―Έν° νμ μΌλ‘ ν΄λ‘μ λ₯Ό μ λ¬ κ°λ₯
// ν¨μλ₯Ό νλΌλ―Έν°λ‘ μ λ¬λ°λ doSomethingμ΄λΌλ ν¨μ
func doSomething(closure: () -> ()) {
closure()
}
// ν¨μ νΈμΆ
doSomething(closure: { () -> () in
print("Hello!") // Hello!
})
doSomething ν¨μλ νλΌλ―Έν°λ‘ ν¨μλ₯Ό μ λ¬λ°λ ν¨μμ λλ€.
μ΄ κ²½μ°, νλΌλ―Έν°λ‘ ν¨μλΏλ§ μλλΌ ν΄λ‘μ λ μ λ¬ν μ μλ κ²μ λλ€.
3. ν¨μμ λ°ν νμ μΌλ‘ ν΄λ‘μ λ₯Ό μ¬μ©κ°λ₯
func doSomething() -> () -> () {
return { () -> () in
print("Hello!")
}
}
μμ κ°μ΄ κ°μ 리ν΄ν λλ, ν¨μλΏλ§ μλλΌ ν΄λ‘μ λ₯Ό λ°νν΄μ€ μλ μμ΅λλ€.
ν΄λ‘μ .μκ² λλ° μ΄λ»κ² μ€ννλλ°?
μ΄μ ν΄λ‘μ λ₯Ό νΈμΆν΄μ μ€νμμΌ λ΄ μλ€!
- ν΄λ‘μ κ° λμ λ λ³μλ μμλ‘ νΈμΆνκΈ°
- ν΄λ‘μ λ₯Ό μ§μ μ€ννκΈ°
1. ν΄λ‘μ κ° λμ λ λ³μλ μμλ‘ νΈμΆνκΈ°
μΌκΈκ°μ²΄μ νΉμ§μ μ΄μ©ν΄ ν΄λ‘μ λ₯Ό λ³μλ μμμ λμ νμ¬ μ€νμμΌμ€ μ μμ΅λλ€!
func doSomething() -> () -> () {
return { () -> () in
print("Hello!")
}
}
// μ€ν
let closure = doSomething()
closure()
2. ν΄λ‘μ λ₯Ό μ§μ μ€ννκΈ°
ν΄λ‘μ λ₯Ό λ³μλ μμμ λμ νμ§ μκ³ μ§μ μ€νμν€κ³ μΆμμ μμλμ¬?
μ΄λλ ν΄λ‘μ λ₯Ό ( ) μκ΄νΈλ‘ κ°μΈκ³ , λ§μ§λ§μ νΈμΆ κ΅¬λ¬ΈμΈ ()λ₯Ό μΆκ°ν΄μ£Όλ©΄ λ©λλ€!
({ () -> () in
print("Hello!")
})()
ν΄λ‘μ κ²½λ λ¬Έλ²
ν΄λ‘μ κ° μ΄λ €μ΄ μ΄μ μ€ νλκ° μ κ²½λ λ¬Έλ² λλ¬Έμ΄λΌκ³ μκ°ν©λλ€..
μλ΅νκ³ μλ΅νκ³ ...μλ μλ΅ μ€λ μλ΅
ν΄λ‘μ λ₯Ό κ°λ¨νκ² μ¬μ©ν μ μλ κ²½λ λ¬Έλ²μ μ 리ν΄λ΄ μλ€!
- νν ν΄λ‘μ
- νλΌλ―Έν° νμκ³Ό λ¦¬ν΄ νμ μλ΅
- λ¨μΆ μΈμ μ΄λ¦
- return ν€μλ μλ΅
1. νν ν΄λ‘μ (Trailing Closure)
ν¨μμ 맀κ°λ³μ λ§μ§λ§μΌλ‘ μ λ¬λλ ν΄λ‘μ λ νν ν΄λ‘μ (Trailing Closure)λ‘ κ΅¬ννμ¬
ν¨μ μκ΄νΈ λ°μ ν΄λ‘μ λ₯Ό ꡬνν μ μμ΅λλ€. λμ리μΌ..νμ₯
μμλ‘ λ΄ μλ€!
func doSomething(closure: () -> ()) {
closure()
}
// νΈμΆ
// ν΄λ‘μ κ° νλΌλ―Έν°μ κ° νμμΌλ‘ ν¨μ νΈμΆ ꡬ문() μμ μμ±
doSomething(closure: { () -> () in
print("Hello!")
})
μμμ ν΄λ‘μ κ° νλΌλ―Έν°λ‘ μ λ¬λ κ²½μ°μ μ½λλ₯Ό κ°μ§κ³ μμ΅λλ€!
μ΄ κ²½μ° λ§μ§λ§μ κ΄νΈλ }) μ΄λ κ² λμ΄ μμ΄ ν·κ°λ¦¬κΈ° μ½κ³ , μ½λλ₯Ό λ± λ΄€μ λ ν΄μλ μ½μ§ μμ΅λλ€..
μ΄λ₯Ό νν ν΄λ‘μ λ‘ κ΅¬νν΄μ€λ€λ©΄ λ 보기 κΉλν΄μ§λλ°μ,
doSomething () { () -> () in
print("Hello!")
}
μ΄λ κ² νν ν΄λ‘μ λ‘ κ΅¬ν μμλ ν΄λ‘μ λ₯Ό νλΌλ―Έν° κ° νμμΌλ‘ 보λ΄λ κ²μ΄ μλλΌ
ν¨μμ κ°μ₯ λ§μ§λ§μ ν΄λ‘μ λ₯Ό 꼬리μ²λΌ λ§λΆμ¬μ μ¨μ€λλ€!
μ¬κΈ°μ μ€μν κ²!
νλΌλ―Έν°κ° ν΄λ‘μ νλμΌ κ²½μ°,
μ΄ ν΄λ‘μ λ 첫 νλΌλ―Έν°μ΄μ λ§μ§λ§ νλΌλ―Έν°μ΄λ―λ‘ νν ν΄λ‘μ κ° κ°λ₯ν©λλ€.
λν, "closure"λΌλ Argument Labelμ νν ν΄λ‘μ μμ μλ΅λ©λλ€.
νλΌλ―Έν°κ° ν΄λ‘μ νλμΌ κ²½μ°μλ
νΈμΆκ΅¬λ¬ΈμΈ ()λ μλ΅ν μλ μμ΅λλ€!!! μλ΅μ μλ΅μ μλ΅
doSomething { () -> () in
print("Hello!")
}
μ¬κΈ°μ μ κΉ..νν ν΄λ‘μ μ λν΄ μ 리νλ€ λ¨Έλ¦Ώμμ μ€μ³μ§λκ° μΉκ΅¬....forEach..!
λ°λ³΅λλ μ½λλ₯Ό μ€μ΄κΈ° μν΄ νμ μμ κ°μ΄ forEachλ₯Ό μ λ§ λ§μ΄ μ¬μ©νλλ°μ,,
forEach λν νν ν΄λ‘μ λ‘ κ΅¬νν ꡬ문μ΄μλ€λ κ²!
μ½λλ₯Ό λ―μ΄λ³΄λ©΄, λ°λ³΅νκ³ μΆμ ꡬ문μ forEachλΌλ ν¨μμ νλΌλ―Έν°λ‘ ν΄λ‘μ λ‘ μμ±ν΄μ λ겨주λ ννμμ μ μ μμ΅λλ€.
λ€μμ λ μ 리ν΄λκ°κ² μ§λ§, νλΌλ―Έν° νμκ³Ό λ¦¬ν΄ νμλν μλ΅ κ°λ₯νκΈ° λλ¬Έμ μ΄λ₯Ό μλ΅ν΄μ£Όκ³ ,
νλΌλ―Έν°κ° ν΄λ‘μ νλλ§ μ λ¬λλ κ²½μ°μ΄κΈ° λλ¬Έμ νν ν΄λ‘μ νμμΌλ‘ ꡬνν ν,
forEach ν¨μμ νΈμΆκ΅¬λ¬ΈμΈ ()κΉμ§ μλ΅ν΄μ€ ννμ λλ€! (μ΄μ μ λλ‘ μκ³ μΈ μ μκ² λ€μπ)
2. νλΌλ―Έν° νμκ³Ό λ¦¬ν΄ νμ μλ΅
forEachμ λν΄ μ€λͺ νλ€ μ κΉ μΈκΈλκΈ°λ νλλ°μ, ν΄λ‘μ μμ νλΌλ―Έν° νμκ³Ό λ¦¬ν΄ νμ λν μλ΅ κ°λ₯ν©λλ€!
doSomething(closure: { (a: Int, b: Int, c: Int) -> Int in
return a + b + c
})
// μλ΅
doSomething(closure: { (a, b, c) in
return a + b + c
})
3. λ¨μΆ μΈμ μ΄λ¦
ν΄λ‘μ μμ νλΌλ―Έν° λ€μμ μλ΅νλ λ°©λ²μΌλ‘ λ¨μΆ μΈμ μ΄λ¦μ μ¬μ©ν©λλ€.
λ¨μΆ μΈμ μ΄λ¦μ ν΄λ‘μ μ 맀κ°λ³μμ μμλλ‘ $0, $1, $2...μ²λΌ ννν©λλ€.
μ¬κΈ°μ μ€μν μ ! νλΌλ―Έν° μ΄λ¦μ λ¨μΆ μΈμ μ΄λ¦μΌλ‘ λ체ν κ²½μ°, νλΌλ―Έν° μ΄λ¦κ³Ό ν¨κ» in ν€μλλ₯Ό μμ ν΄μ€λλ€.
doSomething(closure: { (a, b, c) in
return a + b + c
})
// λ¨μΆ μΈμ μ΄λ¦ μ μ©
doSomething(closure: {
return $0 + $1 + $2
})
μμμ νλΌλ―Έν° νμκ³Ό λ¦¬ν΄ νμκΉμ§ μλ΅ν΄μ€ doSomething ν¨μμ λ¨μΆ μΈμ μ΄λ¦μ μ μ©ν λͺ¨μ΅μ λλ€!
μ½λκ° ν¨μ¬ κ°κ²°ν΄μ‘μ£ ??
4. return ν€μλ μλ΅
μμμ μ κΉ μΈκΈλμλλ°, ν¨μλ 리ν΄νμ μ΄ μμ λλ§ μλ΅κ°λ₯ν κ²κ³Ό λ€λ₯΄κ²
ν΄λ‘μ λ 리ν΄νμ μ΄ μμ΄λ μλ΅κ°λ₯νλ€κ³ νμ£ ??
μ΄λ₯Ό μμμ λ°ν ννμ΄λΌκ³ νλ€κ³ μμμ μ κΉ μ€λͺ νμλλ°μ!
μμ μ€λͺ μ λ€μ κ°μ Έμ보μλ©΄,
ν΄λ‘μ κ° λ°ννλ κ°μ΄ μλ€λ©΄ ν΄λ‘μ μ λ§μ§λ§ μ€μ κ²°κ³Όκ°μ
return ν€μλλ₯Ό μλ΅νλλΌλ μμμ μΌλ‘ λ°νκ°μΌλ‘ μ·¨κΈν©λλ€.
μ£Όμν μ μ, λ¨μΌ 리ν΄λ¬ΈμΌ μμλ§ μ μ©λλ€λ κ²!
doSomething(closure: {
$0 + $1 + $2
})
μμ μ½λλ₯Ό λ€μ κ°μ Έμ μμμ λ°ν ννμ μ μ©ν΄μ€ λͺ¨μ΅μ λλ€!
νλΌλ―Έν°λ‘ ν΄λ‘μ νλκ° λμ΄μ€λ κ²½μ°λκΉ νν ν΄λ‘μ λ‘ ννν΄λ³ΌκΉμ??
// ννν΄λ‘μ λ‘ λ°κΎΈκ³ ,
doSomething() {
$0 + $1 + $2
}
// ()λ μλ΅ κ°λ₯. μλλ©΄ νλΌλ―Έν° νλμΈ κ²½μ° ()μ μ무κ²λ μλ€λ©΄ μλ΅ κ°λ₯νλκΉ
doSomething {
$0 + $1 + $2
}
μ΅μ’ μ μΌλ‘ μ΄λ κ²κΉμ§ μλ΅ν΄μ ννν μ μμ΅λλ€!
But λ무 μΆμ½λ μ½λλ νμΈμ΄ 보거λ, μκ°μ΄ μ§λ νμ λ³Ό λ κ°λ μ±μ΄λ λͺ μμ±μ΄ λ¨μ΄μ§ μ μμΌλ―λ‘ μ μ μ μμ μΆμ½νλλ‘ ν©μλ€!
ν΄λ‘μ κ° λ¬΄μμΈμ§, κ·Έλ¦¬κ³ ν΄λ‘μ μ νΉμ§κ³Ό κ²½λ λ¬Έλ²κΉμ§ ν΄λ‘μ μ κΈ°λ³Έμ λν΄ μ 리ν΄λ³΄μλλ°μ!
λ€μ ν¬μ€ν μΌλ‘ escaping closureλ₯Ό λ€κ³ μ€λλ‘ νκ² μ΅λλ€!ππ
μ°Έκ³ μλ£
https://babbab2.tistory.com/81
https://babbab2.tistory.com/82
https://osoomoovo.tistory.com/175
'π iOS > Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift] enumerated() (0) | 2023.01.07 |
---|---|
[Swift] κ³ μ°¨ν¨μ - map, filter, reduce (1) | 2022.11.29 |
[Swift] νμ μΆλ‘ κ³Ό νμ μ΄λ Έν μ΄μ (0) | 2022.07.31 |
[Swift] if letκ³Ό guard letμ μ°¨μ΄ (4) | 2022.03.04 |
[Swift] Escaping Closure(νμΆ ν΄λ‘μ ) (8) | 2022.02.21 |