์๋ ํ์ธ์, ๊ฐ์์ ๋๋ค! ์ด๋ฒ ์๊ฐ์๋ ํด๋ก์ ์ ๋ํด์ ์์๋ณด๋๋ก ํฉ์๋ค.
๋ณธ ํฌ์คํ ์ ํจ์คํธ์บ ํ 30๊ฐ ํ๋ก์ ํธ๋ก ๋ฐฐ์ฐ๋ ios์ฑ ๊ฐ๋ฐ, ๋ค๋ฅธ ๋ธ๋ก๊ทธ๋ค์ ์ฐธ๊ณ ํด์ ์์ฑํ ๊ธ์ ๋๋ค. ์ถ์ฒ๋ ๋ฐ์๋จ๊ฒจ์!
ํด๋ก์ ๋?
ํด๋ก์ ๋ ์ฐธ์กฐํ์ ์ด๊ณ , ์ฝ๋์์ ์ ๋ฌ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ ๋ฆฝ๊ธฐ๋ฅ์ด๋ฉฐ, ์ผ๊ธ ๊ฐ์ฒด์ ์ญํ ์ ํ๋ค. ์ผ๊ธ๊ฐ์ฒด๋ ์ ๋ฌ์ธ์๋ก ๋ณด๋ผ ์๋ ์๊ณ , ๋ณ์/์์ ๋ฑ์ผ๋ก์ ์ฅํ๊ฑฐ๋ ์ ๋ฌ ํ ์ ์์ผ๋ฉฐ, ํจ์์ ๋ฐํ๊ฐ์ด ๋ ์๋ ์๋ ๊ฒ์ ์๋ฏธํ๋ค. ๋ณดํต ํด๋ก์ ๋ผ๊ณ ํ๋ฉด ์ด๋ฆ์๋ ํจ์ ์ฆ, ์ต๋ช ํจ์๋ฅผ ์ง์นญํ๋ค.
๋ฐ๋ผ์ ํด๋ก์ ๋ named ํด๋ก์ , unnamed ํด๋ก์ ๋๋ค ํฌํจํ๋ค.
ํด๋ก์ ํํ์์ ๋ค์๊ณผ๊ฐ๋ค. ์ต๋ช ํจ์์ฌ์ func๋ผ๋ ํค์๋๋ ์ฐ์ง ์๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋ก์ ํค๋์ ํด๋ก์ ๋ฐ๋๋ก ์ด๋ฃจ์ด์ ธ์๋ค.
๋ ธ๋์ ๋ถ๋ถ์ด ํด๋ก์ ํค๋, ํํฌ์ ๋ถ๋ถ์ด ํด๋ก์ ๋ฐ๋์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋์ ๊ตฌ๋ถ ์ง์ด์ฃผ๋ ๊ฒ์ด ๋ฐ๋ก in์ด๋ผ๋ ํค์๋์ด๋ค. ์ฝ๋๋ฅผ ํตํด ํด๋ก์ ์ ์ฌ์ฉ๋ฐฉ๋ฒ์ ์์๋ณด์.
ํด๋ก์ ์ ์ฌ์ฉ ๋ฐฉ๋ฒ
ํด๋ก์ ๋ ์ต๋ช ์ด๊ธด ํ์ง๋ง ํจ์์ด๋ค. ๋ฐ๋ผ์ ์ผ๊ธ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ์์๋ ๋ณ์์ ํด๋ก์ ๋ฅผ ๋์ ํ ์ ์๋ค.
1) ํ๋ผ๋ฏธํฐ์ ๋ฆฌํด๊ฐ์ด ๋ชจ๋ ์๋ ํํ์ ํด๋ก์ ๋ฅผ ์์ฑํด๋ณด์.
let hello = { () -> () in
print("hello")
}
hello()
//prints "hello"
2) ํ๋ผ๋ฏธํฐ์ ๋ฆฌํดํ์ ์ด ์๋ ํด๋ก์ ๋ ๋ง๋ค์ด๋ณด์.
let hello2 = { (name: String) -> String in
return "Hello, \(name)"
}
ํจ์๋ฅผ ํธ์ถํด๋ณด์.
hello2(name: "potato")
์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ์ ? ํจ์์ด๊ธด ํ๋ค๋ฉด์ ์ ์๋ฌ๊ฐ ๋๋ ๊ฒ์ผ๊น?
์ฌ๊ธฐ์ ์ฃผ์ํด์ผํ ์ ์ด ์๋ค. ํจ์์์ ๋ฐฐ์ด๋๋ก ํ๋ผ๋ฏธํฐ์ name์ ๋จ๋
์ผ๋ก ์ฐ์์ผ๋, ์ด name์ด ์ ๋ฌ์ธ์์ ๋ ์ด๋ธ์ด์ ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ์ผ๋ก name์ ์ฌ์ฉํ๊ณ ์๊ตฌ๋~ ํ๊ณ ์ดํดํ ์๋ ์๋ค. ํ์ง๋ง, ํด๋ก์ ์์๋ ์ ๋ฌ์ธ์ ๋ ์ด๋ธ์ด๋ผ๋ ๊ฐ๋
์ ๋ค๋ฃจ์ง ์๋๋ค. ๋ฐ๋ผ์ ์ ์ฝ๋์์ ํ์ฌ name์ ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ผ๋ก๋ง ์ฐ์ด๊ณ ์๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ํจ์๋ฅผ ํธ์ถํ ๋๋ ์ ์ฝ๋ ์ฒ๋ผ ํจ์(์ ๋ฌ์ธ์: "!@#") ๋ผ๊ณ ์ผ๋ฐ ํจ์ ์ฒ๋ผ ํธ์ถํ๋ฉด ์๋ฌ๋ฅผ ๋ฐ์ํ๋ ๊ฒ์ด๋ค. ์๋ฌ ์์ด ํด๋ก์ ๋ฅผ ํธ์ถํ๋ ค๋ฉด ์๋์ฒ๋ผ ์จ์ผํ๋ค.
hello2("potato")
// prints Hello, potato
์ ๋ฌ์ธ์ ์ด๋ฆ์ ์ ์ง ์๊ณ ํ๋ผ๋ฏธํฐ ๊ฐ๋ง ๋ฐ๋ก ๋๊ฒจ์ฃผ์ด์ผ ํ๋ค. ๊ทธ๋ผ ํด๋ก์ ์ ๋ฐํ๊ฐ์ด ์ถ๋ ฅ๋๋ค.
3) ๊ทธ๋ฆฌ๊ณ ํด๋ก์ ๋, ํจ์์ ํ๋ผ๋ฏธํฐ ํ์ ์ผ๋ก ํด๋ก์ ๋ฅผ ์ ๋ฌ ํ ์๋ ์๋ค.
ํด๋ก์ ๋ฅผ ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ๋ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์.
func doSomething(closure: () -> ()) {
closure()
}
doSomethingํจ์ ํ๋ผ๋ฏธํฐ์ ํด๋ก์ ๋ฅผ ์ ๋ฌ ๋ฐ์ ์ ์๊ฒ ์์ฑํ๋ค. ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ closure๋ผ๊ณ ํ๋ค. ํ๋ผ๋ฏธํฐ์ ๋ฆฌํดํ์ ์ด ์๋ ํด๋ก์ ๋ฅผ ์ ๋ฌ๋ฐ์ ์ ์๊ฒ ํ๋ค. ๊ทธ๋ฆฌ๊ณ doSomethingํจ์๊ฐ ํธ์ถ๋๋ฉด closure()๊ฐ ํธ์ถ๋๊ฒ ๋ง๋ค์๋ค.
์ด์ doSomething์ ํธ์ถํด๋ณด์.
doSomething(closure: { () -> () in
print("hello")
})
closure์ ํ๋ผ๋ฏธํฐ์ closureํจ์๋ฅผ ๋๊ฒจ๋ณด์. ๋ฐํ๊ฐ๊ณผ ๋ฆฌํด์ด ์๋ ํจ์์ด๋ฏ๋ก () -> ()๋ฅผ ์์ฑํด์ฃผ๊ณ , in์คํ๊ตฌ๋ฌธ์ผ๋ก printํจ์๋ฅผ ๋ฃ์ด์ฃผ์๋ค. ๊ทธ๋ฆฌ๊ณ ์คํํ๋ฉด "hello"๊ฐ ์ถ๋ ฅ๋๋ค.
4) ํจ์์ ๋ฐํํ์ ์ ํด๋ก์ ๋ฅผ ๋ฃ์ ์๋ ์๋ค.
์ฝ๋๋ฅผ ์ดํด๋ณด์.
func doSomething2() -> () -> () {
return { () -> () in
print("hellohellohello")
}
}
doSomething2()() //ํธ์ถ
//prints "hellohellohello"
์ด์ฒ๋ผ closure๋ ์ผ๊ธ๊ฐ์ฒด์ ํน์ง์ ๊ทธ๋๋ก ๊ฐ๊ณ ์์ด์ ๋ณ์๋ ์์์ ๋์ ํ ์ ์๊ณ , ํจ์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ฐ๊ณ , ๋ฆฌํดํ์ ์ผ๋ก๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด๋ค.
ํด๋ก์ ๊ฐ ์กฐ๊ธ ๊ธธ์ด์ง๊ฑฐ๋ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ค๊ณ ์๊ฐ๋๋ฉด ํํํด๋ก์ ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก์จ ๊ฐ๋ ์ฑ ๋์ ์ฝ๋๋ก ๋ง๋ค ์ ์๋ค.
- ์ปดํ์ผ๋ฌ๊ฐ ํด๋ก์ ์ ํ์ ์ ์ ์ถํ ์ ์๋ ๊ฒฝ์ฐ์๋ ๋งค๊ฐ๋ณ์๋ ๋ฐํํ์ ์ ์๋ตํด์ ์์ฑํ ์ ์๋ค.
- ๋ฐํ๊ฐ์ด ์๋ ๊ฒฝ์ฐ, ์๋ฌต์ ์ผ๋ก ํด๋ก์ ์ ๋งจ ๋ง์ง๋ง์ค์ returnํค์๋๋ฅผ ์ญ์ ํ๋๋ผ๋ ๋ฐํ๊ฐ์ผ๋ก ์ทจ๊ธํ๋ค.
- ์ ๋ฌ์ธ์์ ์ด๋ฆ์ด ๊ตณ์ด ํ์์๊ณ , ์ปดํ์ผ๋ฌ๊ฐ ํ์ ์ ์ถ๋ฅผ ํ ์ ์๋ ๊ฒฝ์ฐ์๋ ์ถ์ฝ๋ ์ ๋ฌ์ธ์ ์ด๋ฆ ($0, $1, $2....)๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ด ๋ชจ๋ ๊ฒ์ ํ ํฌ์คํ ์ผ๋ก ์ ๋ก๋ํ๋๊ฒ์ ์ด๋ ต๊ธฐ๋ํ๊ณ ํด๋ก์ ์ ๊ฐ๋ ์ ๋๊ณ ๋ ๋๊ธฐ ๋๋ฌธ์ ์ถํ ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ ๊ด๋ จ๋ ์ํฉ์ด ๋ฐ์ํ๋ฉด ๋ ์ถ๊ฐ์ ์ผ๋ก ๊ณต๋ถํด๋ณด๋ ๊ฒ์ผ๋ก ํ๊ณ , ์ง๊ธ์ ์ด๋ค์์ผ๋ก ์ถ์ฝ์ด ์ด๋ฃจ์ด์ ธ์ ์ฝ๋๊ฐ ๊ฐ๋ ์ฑ์ด ๋์์ง๋์ง ์ดํด๋ณด๋๋ก ํ๊ฒ ๋ค.
func doSomething(closure: (Int, Int, Int) -> Int) {
closure(1,2,3)
}
// doSomethingํธ์ถ
//์ถ์ฝ์
doSomething(closure: { (a, b, c) in
return a+b+c
})
//๋จ๊ณ๋ณ ์ถ์ฝ ํ
doSomething(closure: {
return $0+$1+$2
})
doSomething(closure: {
$0+$1+$2
})
doSomething() {
$0+$1+$2
}
//์ต์ข
์ ์ผ๋ก ์ถ์ฝํ ํํ
doSomething {
$0+$1+$2
}
์ถํ ๋ ๊ณต๋ถํด์ ๋ด์ฉ์ ์ถ๊ฐํด๋ณด๋๋ก ํ๊ฒ ๋ค.