- Published on
๐ Swift - ํด๋ก์ (Closure).02
- Authors
- Name
- ์ด์ฐฝ์ค
์ด๋ฒ์๋ ๋ฉ์น๊ฐ ํฐ ํด๋ก์ ๋ผ๋ ์น๊ตฌ๋ฅผ ๋ค์ด์ดํธ ์ํค๋ ๋ฐฉ๋ฒ๊ณผ ์ ๋ฅผ ๊ณค๋ํ๊ฒ ๋ง๋ @escaping ํด๋ก์ ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค
์ฐ๋ฆฌ ํด๋ก์ ๋ผ๋ ์น๊ตฌ๋ ๋ฉ์น๊ฐ ๋๋ฌด ํฝ๋๋ค.. ์ด์ ๊ฒ์๋ฌผ์ ์์๋ฅผ ๋ค์ ๊ฐ์ ธ์๋ณผ๊น์?
foo(closure: { () -> () in
print("Hi! I'm Closure")
})
ํด๋ก์ ๋ฅผ ์ธ์๋ก ๋ฐ๋ ํจ์์ ํธ์ถ๋ฒ์ ๋๋ค. ์ ์์๋ ์ฌ์ค ์์ฃผ ๋จ์ํ ์น๊ตฌ์์ฃ ?
foo(closure)
๋ค.. ๊ฐ๋งํ ํ๋ฒ ๊ด์ฐฐํด๋ณด๋ฉด ์ด ์น๊ตฌ๋
() -> ()
์ ๋ถ๋ถ์ด๋ผ๋์ง..
closure:
์ ๋ถ๋ถ์ด๋ผ๋์ง.. ๋ถํ์ํ๊ฒ ๋ช ์๋์ด ์๋ ์ฌ๋ฌ ๋ถ๋ถ๋ค์ด ๋ณด์ ๋๋ค. ๋ง์น ์ ์ ๋ชธ์ ๋ถ์ด์๋ ๋ถํ์ํ ์ง๋ฐฉ๊ฐ์ฃ . ๐
๊ทธ๋์ ์ง๊ธ๋ถํฐ๋ ํด๋ก์ ์ ์ฒด์ค ๊ฐ๋๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค.
Trailing Closure (ํธ๋ ์ผ๋ง ํด๋ก์ )
๋ ์๋ก์ด ์ฉ์ด๊ฐ ๋์์ง๋ง ์ดํด๋ฅผ ๋๊ธฐ ์ํ ๋๊ตฌ๋ก์ ์ ๊ทผํด๋ด ์๋ค. โTrailing = ๋์ ๋ถ์โ ์ด๋ผ๋ ๋ป์ด์ฃ ?
์ด ๊ฒฝ๋๋ฒ์ ํจ์์ ๋ง์ง๋ง ์ธ์๋ก ํด๋ก์ ๊ฐ ๋ค์ด๊ฐ์์ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ง์ง๋ง ํด๋ก์ ๋ฅผ ๋นผ๋ด์ ํจ์์ ๋์ ๊ฐ๋ตํํด์ ๋ถ์ฌ์ฐ๋ ๋ฐฉ๋ฒ์ด์ฃ . ์ด ๋, ์ธ์์ ์๋ฆฌ์์ ๋ฐ์ณ๋์์ผ๋ ์ธ์๋ช ์ ์ ์ง ์์ต๋๋ค.
์ญ์ ์์๊ฐ ์ดํด์ ์ง๋นต์ด์ฃ ?
foo(closure: { () -> () in
print("Hi! I'm Closure")
})
๋ค ์์ ์์์ ๊ฐ์ ์์์
๋๋ค. function({ โฆ })
์ด๋ ๊ฒ ๊ดํธ์์ ์ค๊ดํธ๊ฐ ๋ค์ด๊ฐ์์ด์ ํ ๋์ ํ์
์ด ์ด๋ ค์ด ์ ์ด ์์์ต๋๋ค. ๊ทธ๋์ Trailing Closure๋ฅผ ์ฌ์ฉํด๋ณผ๊ฒ์!
foo() { () -> () in
print("Hi! I'm Closure")
}
์ด๋ ๊ฒ!! function() { โฆ }
ํํ๋ก ๋ฐ๊ฟ ์ ์๊ณ , closure:
์ ๊ฐ์ ์ธ์๋ช
๋ ์๋ตํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์์ ์ถ๊ฐ๋ก! ์ธ์๊ฐ ํด๋ก์ ๋จ ํ๋์ผ ๊ฒฝ์ฐ์๋ ()
๊น์ง ์๋ต ๊ฐ๋ฅํฉ๋๋ค.
foo { () -> () in
print("Hi! I'm Closure")
}
์ด๋ ๊ฒ ๋ง์ด์ฃ !
์ธ์๊ฐ ์ฌ๋ฌ๊ฐ์ธ ๊ฒฝ์ฐ๋ ํ๋ฒ ๋ณผ๊ฒ์.
func fetchData(success: () -> (), fail: () -> ()) {
// Tasks
}
์ ํจ์๋ ์๋์ ๊ฐ์ด ํธ์ถ๋ ๊ฒ๋๋ค.
fetchData(success: { () -> () in
print("Success")
}, fail: { () -> () in
print("Fail")
})
์ด ํธ์ถ๋ฒ์ Trailing Closure๋ฅผ ํ์ฉํด๋ณผ๊ฒ์.
fetchData(success: { () -> () in
print("Success")
}) { () -> () in
print("Fail")
}
์ด๋ ๊ฒ! ๋ง์ง๋ง ํด๋ก์ ์ธ์๋ง ๋ค๋ก ์ ๋บ ์ ์์ฃ .
์ ๋ฆฌํด๋ณผ๊น์?
- ๋ง์ง๋ง ์ธ์๊ฐ ํด๋ก์ ์ธ ๊ฒฝ์ฐ, ํด๋น ํด๋ก์ ๋ฅผ ์ธ์์์ ๋นผ๋ด์ ํจ์ ๋ค์ ๋ถ์ผ ์ ์๋ค.
- ์ด ๋, ์ธ์๋ช ์ ์๋ต๋๋ค.
- ๋ง์ฝ ์ธ์๊ฐ ํด๋ก์ ๋จ ํ๋์ผ ๊ฒฝ์ฐ์๋ ํจ์ ํธ์ถ ๊ตฌ๋ฌธ์ธ () ๋ํ ์๋ตํ ์ ์๋ค.
( ) -> ( ) in ์๋ต
์.. ๊ทธ๋ฐ๋ฐ ์ฌ์ค ์ ํฌ ๋์ ์ ์ผ ๊ฑฐ์ฌ๋ฆฌ๋๊ฑด ์ ๋ฐ ๋ง์ด๋ํ ๋ถ๋ถ์ด ์๋๋๋ค. ๋ณธ์ธ์ด ํด๋ก์ ๋ผ๊ณ ๋น๋นํ ์๋ฆฌ์น๊ณ ์๋ () -> () in
์ด ๋ถ๋ถ์ด์ฃ .
๋๋ฌด ์๊ธฐ์ฃผ์ฅ์ด ๊ฐํด์ ํด๋ก์ ๊ตฌ๋ฌธ์ ๋ณด๋ฉด ์ ๋ถ๋ถ๋ถํฐ ๋์ด ๊ฐ๋๋ค. ๊ทธ๋์ ์ ๋ถ๋ถ์ ์๋ตํด๋ณผ๊ฒ๋๋ค.
์ ์๋์ ๊ฐ์ ํจ์๊ฐ ์์ต๋๋ค.
func foo(closure: (Int, Int, Int) -> (Int)) {
closure(1, 2, 3)
}
์ธ์๋ก Intํ 1, 2, 3์ ๋ฐ์ Intํ Return Type์ ๋ด๋ณด๋ด๋ ํด๋ก์ ๋ฅผ ์ธ์๋ก ๊ฐ๋ ํจ์ foo()์ด๋ค์. ์ด ํจ์๋ฅผ ํธ์ถํ ๋๋ ์ด๋ป๊ฒ ํด์ผํ ๊น์?
foo(closure: {closure: (a: Int, b: Int, c: Int) -> Int in
return a + b + c
})
ํน์ Trailing Closure๋ฅผ ์ฌ์ฉํด์
foo() { (a: Int, b: Int, c: Int) -> Int in
return a + b + c
}
์ด๋ฐ์์ผ๋ก ์ฃผ์ ๋ฆฌ์ฃผ์ ๋ฆฌ.. ๊ต์ฅํ ๊ธธ์ด์ง๋๋ค. ์ฌ์ง์ด ์ ์์๋ ๊ต์ฅํ ๊ฐ๋จํ ์์์ด์ฃ ? ์ค์ ์์ ๋์ฑ ๋ณต์กํด์ง๊ณ ๊ธธ์ด์ง๊ฒ๋๋ค. ๊ทธ๋์ ์ด ์น๊ตฌ๋ฅผ ์ด ๋ค์ฏ ๋จ๊ณ์ ๊ฑธ์ณ ์ถ์ฝํด๋ณผ๊ฒ์!
1. ๋ฐ์ดํฐ ํ์ ์ ์๋ตํ๋ค.
๊ฐ์ฅ ๋ง๋งํ ๋ฐ์ดํฐ ํ์ ๋ถํฐ ์๋ตํด๋ด ์๋ค. Swift๋ ํ๋ ์ธ์ด์ ๊ธฐ๋ณธ ์์์ธ โ๋ฐ์ดํฐํ์ ์์์ ์ฒ๋ฆฌํ๊ธฐโ ๊ธฐ๋ฅ์ด ๋น์ฐํ ์์ต๋๋ค. ์ด๋ฅผ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ ๋ฐฉ๋ฒ์ด์ฃ .
foo(closure: {closure: (a: Int, b: Int, c: Int) -> Int in
return a + b + c
})
์ฌ๊ธฐ์ Int ํ์ ๋ค์ ์ ๋ถ ์๋ตํฉ๋๋ค!
foo(closure: {closure: (a, b, c) in
return a + b + c
})
๐ฎ๐ฎ๐ฎ
๋ฒ์จ๋ถํฐ ์์ฒญ๋๊ฒ ์ค์ด๋ค์๋ค์! ๋ฌผ๋ก ๋ฐ์ดํฐํ์ ์ ๋ํด ์๊ฒฉํ๊ฒ ๊ด๋ฆฌํ์ค๊ฑฐ๋ฉด ํ๋ํ๋ ์ ์ด์ฃผ์๋๊ฒ ์ข์ต๋๋ค.
2. ํด๋ก์ ์ ์ธ์๋ช ์ ์๋ตํ๊ณ shortand๋ฅผ ์ฌ์ฉํ๋ค.
์ฐ์ shortand๊ฐ ๋ฌด์์ด๋ ํ๋ฉด,
($0, $1, $2)
์ ์น๊ตฌ๋ค์ ๋๋ค. ํ์ด์ฌ์ ๋ค๋ค๋ณด์ ๋ถ๋ค์ด๋ผ๋ฉด ์ต์ํ์ค๊ฑฐ์์. ๊ฐ๊ฐ (์ฒซ ๋ฒ์งธ ์ธ์, ๋ ๋ฒ์งธ ์ธ์, ์ธ ๋ฒ์งธ ์ธ์) ๋ฅผ ์๋ฏธํ์ฃ .
์ด๋ฅผ ์ ์์์ ํ ๋ฒ ์ ์ฉํด๋ณผ๊น์?
foo(closure: {closure: (a, b, c) in
return a + b + c
})
์จ์์~
foo(closure: {
return $0 + $1 + $2
})
์์ฐ.. ์ด์ ๋ ๋ฒ์งธ ๋จ๊ณ์ธ๋ฐ ๋ฒ์จ ์์ฒญ๋๊ฒ ๋จ์ํด์ก์ด์.
๋ฌผ๋ก ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์๋ ์ ์ํ ์ ์ ์์ต๋๋ค. ์ธ๋ฑ์ค ์์ ์ธ์์ ์๋ฅผ ์ ํํ ๋ง์ถฐ์ฃผ์ ์ผ ํด์!
3. ํด๋ก์ ๊ตฌ๋ฌธ ์์ return๋ง ์์ ๊ฒฝ์ฐ, ์ด ๋ํ ์๋ตํ๋ค.
์ด๊ฑด ๋น ๋ฅด๊ฒ ์์๋ก ๋ณด๊ณ ๋์ด๊ฐ์๋ค.
foo(closure: {
return $0 + $1 + $2
})
์ด๋ ๊ฒ ํด๋ก์ ์์ return ๊ตฌ๋ฌธ๋ง ์๋ ๊ฒฝ์ฐ์๋?
foo(closure: {
$0 + $1 + $2
})
์ด๋ ๊ฒ return
๋ํ ์๋ตํด์ค ์ ์์ต๋๋ค.
4. Trailing Closure
์์์ ๋ค๋ฃฌ Trailing Closure๋ฅผ ์ ์ฉํด์ค์๋ค.
foo(closure: {
$0 + $1 + $2
})
๋ง์ง๋ง ์ธ์๋ฅผ ํจ์ ๋ค๋ก ๋นผ๋ฒ๋ฆฌ์ฃ !
foo() {
$0 + $1 + $2
}
ใ ใ ;;;
5. ์ธ์๊ฐ ํด๋ก์ ๋จ ํ๋๋ผ๋ฉด? ( )๋ ์๋ตํ๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ์์์ ๋ค๋ค์์ฃ ? ์ธ์๊ฐ ํด๋ก์ ๋จ ํ๋์ด๊ณ , Trailing Closure๋ฅผ ์ ์ฉํ๋ฉด ()
์์๋ ์๋ฌด๊ฒ๋ ๋จ์์์ง ์์ต๋๋ค.
foo() {
$0 + $1 + $2
}
์์ด์ ธ๋ผ ( )!
foo {
$0 + $1 + $2
}
์ฌ๊ธฐ๊น์ง! ํตํตํ๋ ํด๋ก์ ์น๊ตฌ๊ฐ ์ด์ค์๊ฐ๊ฐ ๋์์ต๋๋ค.. ๋๋ผ๋งํฑํ ์ฐ์ถ์ ์ํด ๋น๊ตํด๋ณผ๊ฒ์.
foo(closure: {closure: (a: Int, b: Int, c: Int) -> Int in
return a + b + c
})
์ด ์น๊ตฌ๊ฐ..
foo {
$0 + $1 + $2
}
์ด๋ ๊ฒ.. ์ด ์ ๋๋ฉด ํด๋ก์ ์น๊ตฌ์ ๊ฑด๊ฐ์ ๊ฑฑ์ ํด์ผ ํ๋๊ฑฐ ์๋๊ฐ ์ถ๋ค์ ๐
๋ฌผ๋ก ์์ ์์๋ ๋งค์ฐ ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ์ ๋๋ค. ์ค์ ์์ ์ด๋ ๊ฒ๊น์ง ์ถ์ฝ๋๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์๋ค๊ณ ๋ณด์ ๋ ๋์ง๋ง, ํ๋๊ฐ์ง๋ง ์ ์ฉํด๋ ๊ฐ์์ฑ์ด ํจ์ฌ ์ข์์ง๋ ์ ๊ทน์ ์ผ๋ก ํ์ฉํด์ค์๋ค!