- Published on
π Swift - ν΄λ‘μ (Closure).01
- Authors
- Name
- μ΄μ°½μ€
νΌμ 곡λΆνλ€ λμ ν μλκ² μ΄μ μ 리ν΄λ³΄λ νκ·Έλ₯Ό νλ λ§λ€μμ΅λλ€! 첫 κ²μλ¬Όμ μ£Όμ λ λλμ μΌλ‘ μ¨μμ§λ§ μ λλ‘ κ³΅λΆν΄λ³Έ μ μ μλ ν΄λ‘μ μ λλ€.
ν΄λ‘μ λ?
μ§κΈκΉμ§ ν΄λ‘μ νλ©΄ κ·Έλ₯ βκ·Έλ£ΉμΌλ‘ μ€νλλ μ½λ λ©μ΄λ¦¬β μ λλ‘ μκ°νκ³ μ¬μ©ν΄μμ΅λλ€. κ·Έλ°λ° μλ£λ₯Ό μ°Ύμ보λ μ΄λ¨Έλ κΈμ κ·Έκ² μ λΆλ€μ?
λ¬Όλ‘ μ¬λ¬κ°μ§ μ΅μ λ€μ΄ μΆκ°λλ©΄μ λ€μνκ² νμ©μ΄ κ°λ₯νμ§λ§ κΈ°λ³Έμ μΈ κ°λ μ μ λ§λ‘ μ½λ λ©μ΄λ¦¬ κ·Έ μ΄μλ μ΄νλ μλμμ΅λλ€.
κ·Έλ°λ° 좩격μ μΈ μ¬μ€μ΄ νλ μμμ΅λλ€. λ°λ‘ ν¨μλ ν΄λ‘μ μλ κ²μ΄μ£ .
ν¨μμΌ λ€λ₯Έ μΈμ΄λ€μμλ κΈ°λ³Έμ μΈ κ°λ μ΄λΌμ Swiftμμλ μ¨μλλ° μκ°ν΄λ³΄λ©΄ ν΄λ‘μ λ ν¨μλ νλ κΈ°λ₯μ κ°μ΅λλ€.
μ ννκ² μ΄ν΄λ³΄λ©΄ ν¨μλ μ΄λ¦μ΄ μλ ν΄λ‘μ μ λλ€. μ΄κ² λ¬΄μ¨ μ리λλ©΄, ν΄λ‘μ μλ Unnamed Closureμ Named Closure μ΄λ κ² λ κ°μ§ μ’ λ₯κ° μμ΅λλ€.
func foo() {
print("Actually, I'm Named Closure")
}
μ ν¬κ° μ€κ³§ μ¬μ©ν΄μλ μμ κ°μ ν¨μλΌλ λ μμ μ¬μ€ Named Closureμλ κ²μ΄μ£ .
let boo = { print("I'm Unnamed Closure") }
κ·Έλ¦¬κ³ μ§κΈκΉμ§ κ°μΌλ‘ μ¬μ©ν΄μ€λ μ λμ Unnamed Closureμ΄μ§λ§, νΈμμ Named Closureλ₯Ό ν¨μλΌκ³ λΆλ₯΄κΈ° λλ¬Έμ μ€μ¬μ κ·Έλ₯ βClosureβλΌκ³ λΆλ λ κ²μ λλ€.
μ κ·Έλμ ν΄λ‘μ λ λμ μ΄λ»κ² μκ²Όλλ? νμλ©΄
{ (Parameters) -> Return in
// tasks
}
μ΄λ κ² μκ²Όμ΅λλ€. Swiftλ₯Ό μ¬μ©νλ€λ³΄λ©΄ κ΅μ₯ν μμ£Ό λμ€κΈ° λλ¬Έμ μμ°μ€μ μ΅μν΄μ§ ꡬ쑰λ€μ..
νμ§λ§ μ λλ‘ νμ΅ν΄λ³΄κΈ° μν΄ κ΅¬μ‘°λ₯Ό λ―μ΄λ΄λ³΄κ² μ΅λλ€. ν΄λ‘μ λ inμ κΈ°μ€μΌλ‘ λ κ°μ§ λΆλΆμΌλ‘ λλ μ μμ΅λλ€. μΈμμ λ°ννμΌλ‘ μ΄λ£¨μ΄μ§ Closure Headμ μ€νλΆκ° μλ Closure Bodyμ΄μ£ .
μ¬μ€ μΈ μ€λ§ μλ©΄ λμ§ μ©μ΄λ μ€μν κ² μλλ μμ νλλ§ κ°λ¨ν λ³΄κ³ λμ΄κ°μλ€!
let boo = { (title: String) -> String in
return "Title: \(title)"
}
ν΄λ‘μ μ κΈ°λ₯, μ¬μ©λ²
μ§κΈλΆν°λ ν΄λ‘μ κ° ν μ μλ κΈ°λ³Έμ μΈ κΈ°λ₯μ μμλ³΄κ² μ΅λλ€. ν¨μμ κ°μ λμΈκ±Έ μμμΌλ ν¨μμ κΈ°λ₯λ€μ μκ°ν΄λ³΄λ©΄μ 보면 λλ¦ μ½μ΅λλ€!
1. ν¨μμ μΈμλ‘μ μ¬μ©λ μ μλ€.
κΈ°λ₯ 첫 λ²μ§Έ! μ²μ λ§μ£Όμ³€μ λ κ°μ₯ λΉν©νλ κΈ°λ₯μ λλ€. μ¬ μ²μ보λ κ΅¬μ‘°κ° ν¨μ μΈμλ‘ λ‘νλ μ리λ₯Ό μ‘κ³ μλλ°, κ΄νΈμ νμ΄νμ μ΄μ§μ΄μ§νλ κΈ°μ΅μ΄ μλ€μ.
func foo(closure: () -> ()) {
closure()
}
μμ κ°μ΄ ν¨μλ₯Ό μΈμλ‘ λ°λ ν¨μ ννλ₯Ό μ¬μ©ν μ μλ€λ μ μμλμ? κ°μΈμ μΌλ‘ μ΅μνμ§λ μμμ μΈμ§λ§ ν΄λκ³ μ§μ μ¬μ©νμ§λ μλ κΈ°λ₯μΈλ°μ, μ¬κΈ°μ ν΄λ‘μ λ₯Ό μ¬μ©νκ² λλ©΄ μ¬μ€μ μμ£Ό μ¬μ©νλ κΈ°λ₯μ΄λΌλ μ¬μ€μ κΉ¨λ«κ² λ©λλ€. μ°Έκ³ λ‘ μ μμμμ closure()λ ν¨μμ λλ€!
foo(closure: { () -> () in
print("Hi! I'm Closure")
})
μ²μ 보μλ λΆλ€μ΄ μ¬κΈ°μ ν€λ‘±ν€λ‘±νκ³ κ³μ€ν λ μμΈν μ΄ν΄λ³΄κ² μ΅λλ€. μμΈν 보면,
{ () -> () in
print("Hi! I'm Closure")
}
μ΄ λΆλΆ.. 보μ΄μλμ? λκ° κ΅μ₯ν κΈΈμ΄λ³΄μ΄μ§λ§ κ·Έλ₯ νλμ ν΄λ‘μ μ λλ€. μ΄ ν΄λ‘μ κ° closureλΌλ μ΄λ¦μΌλ‘ foo() ν¨μμ μΈμλ‘μ μ λ¬λ κ²μ΄μ£ .
μ΄κ² 보μ΄κ³ λλ©΄ μ ꡬ쑰λ μκ°λ³΄λ€ κ°λ¨ν΄μ§λλ€. βHi! Iβm ClosureβλΌλ Stringμ μΆλ ₯νλ ν¨μ closure()
κ° foo()
ν¨μμ μΈμλ‘ μ λ¬λμ΄ μ€νλλ κ΅¬μ‘°μΈ κ²μ΄μ£ .
2. ν¨μμ λ°νμΌλ‘μλ μ¬μ©λ μ μλ€.
λ λ²μ§Έ κΈ°λ₯μ λΉ λ₯΄κ² μ΄ν΄λ΄ μλ€! ν¨μμ μΈμλ‘ ν΄λ‘μ λ₯Ό μ¬μ©ν μ μλ€λ©΄ λ°ν νμ μΌλ‘λ μ¬μ©λ μ μκ² μ£ ?
func foo() -> () -> () {
return { () -> () in
print("Hi! I'm Closure")
}
}
λ€ λ§μμ. μλ λ§λ§μΉ μκ² λ³΅μ‘ν΄λ³΄μ
λλ€. νμ§λ§ μ°λ¦¬μ μ νμ () -> () -> ()
κ°μ μ 맀ν ννμ μ’μνμ§ μμμ.
μ νν κ·Έλλ‘ μ¬μ©λ μΌμ κ±°μ μμΌλ ν΄λΉ ννΈμμ λ€μ μ 리ν΄λ³΄κ² μ΅λλ€.
3. λ³μ/μμμ μ¬μ©ν μ μλ€.
μ¬μ€ μ μΌ κΈ°λ³Έμ μΈ ννμ λλ€.
let closure = { () -> () in
print("Hi! I'm Closure")
}
λ³΄ν΅ returnμΌλ‘ λ³μ/μμμ κ°μ λ£μ΄μ£Όκ² λ©λλ€.
μ¬κΈ°κΉμ§κ° ν΄λ‘μ μ κΈ°λ³Έ κ°λ μ΄λΌκ³ ν μ μμ΅λλ€. λ€μ κ²μλ¬Όμμλ μ κ° μ΄λ κ² μ 리νκ² λ§λ μνμΈ @escaping closure μμ£Όλ‘ μμ±ν΄λ³΄κ² μ΅λλ€!