[Swift] Escaping Closure(ํ์ถ ํด๋ก์ )
์ง๋ ํฌ์คํ ์์ ํด๋ก์ (Closure)์ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ ๋ํด ์ ๋ฆฌํ์๋๋ฐ์,
์ด๋ฒ ํฌ์คํ ์์๋ Escaping Closure์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!๐
[Swift] ํด๋ก์ (Closure)
์ต๊ทผ์ iOS ์คํฐ๋ ์น๊ตฌ๋ค๊ณผ ํจ๊ป ํด๋ก์ ์ ๋ํด ๊ณต๋ถํด๋ณด์๋๋ฐ์, ๋ธ๋ก๊ทธ์๋ ๊ทธ ๋ด์ฉ์ ํ๋ฒ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค!๐ ๋ฐ์ดํฐ ์ ๋ฌ, ์๋ฒ ํต์ ๋ฑ ๋ค์ํ ์ํฉ์์ ์ ์ฉํ๊ฒ ์ด์ฉ๊ฐ๋ฅํ ํด๋ก
janechoi.tistory.com
Escaping Closure๋?
escaping closure๋ ํด์ ๊ทธ๋๋ก ํ์ถ ํด๋ก์ ๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋๋ฐ์,
๋ง ๊ทธ๋๋ก 'ํ์ถ ๊ฐ๋ฅํ' ํด๋ก์ ๋ผ๊ณ ํ ์ ์์ต๋๋ค.
ํ์ถ..? ์ด๋๋ฅผ ํ์ถํด...? ๋ผ๋ ์๋ฌธ์ด ๋์ค ๊ฒ ๊ฐ์๋ฐ์,
์์๋ฅผ ํตํด ๊ธฐ๋ณธ ํด๋ก์ ์ ๋น๊ตํ๋ฉฐ ์ดํดํด๋ณด๋๋ก ํฉ์๋ค!!
์ด์ ํฌ์คํ ์์ ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ํด๋ก์ ๋ฅผ ์ ๋ฌํ ์ ์์์ ์ค๋ช ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์์๋ฅผ ๊ทธ๋๋ก ๋ค๊ณ ์ ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค!
// ํจ์๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ฐ๋ doSomething์ด๋ผ๋ ํจ์
func doSomething(closure: () -> ()) {
closure()
}
์ด ํจ์์ ํด๋ก์ ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํด์ ์คํ์์ผ๋ณธ๋ค๋ฉด?

์์ ์ฝ๋๋ doSomething ํจ์์ print("Hello!")๋ผ๋ ๊ตฌ๋ฌธ์ด ๋ด๊ธด ํด๋ก์ ๊ฐ closure๋ผ๋ ์ด๋ฆ์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ ์ํ์ธ๋ฐ์,
viewDidLoad()์์ ํธ์ถ์ด ๋๋ฉด doSomething ํจ์ ๋ด๋ถ์์ closure ๋ผ๋ ์ด๋ฆ์ผ๋ก ์คํ์ด ๋ฉ๋๋ค.
์คํ ํ ์ฝ์์ ํ์ธํด๋ณด๋ฉด Hello! ๊ฐ ์ ์ฐํ ๊ฒ์ ๋ณด๋ ํธ์ถ ํ ์คํ๊น์ง ์ ๋๊ณ ์์ต๋๋ค!
๊ทธ๋ฐ๋ฐ, ๋ง์ฝ ์ด ํด๋ก์ ๋ฅผ ์ ์ฅํด๋๊ณ ๋ค๋ฅธ ๊ณณ์์ ํธ์ถํ๋ ค๊ณ ํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
ํด๋ก์ ์ ์ผ๊ธ๊ฐ์ฒด์ ํน์ฑ์ ํ์ฉํด์ ํจ์ ์ธ๋ถ์ ํด๋ก์ ๋ฅผ ๋ด๋ ๋ณ์๋ฅผ ์ ์ธํด์
์ด ๋ณ์์๋ค๊ฐ ํ๋ผ๋ฏธํฐ๋ก ๋์ด์จ ํด๋ก์ ๋ฅผ ๋ด์ ์ ์ฅํด๋ณด๊ฒ ์ต๋๋ค!

์ธ๋ถ์ ์ ์ธ๋ ๋ณ์์ธ nonEscapingClosure์ closure๋ผ๋ ์ด๋ฆ์ ํ๋ผ๋ฏธํฐ๋ก ๋์ด์ค๋ ํด๋ก์ ๋ฅผ ๋ฃ์ผ๋ ค๊ณ ํ๋
์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ํ์ธํ ์๊ฐ ์์ต๋๋ค!

์๋ฌ ๋ฉ์์ง๋ฅผ ํ์ธํด๋ณด๋ closure๋ผ๋ ์ด๋ฆ์ non-escaping ํ๋ผ๋ฏธํฐ๋ฅผ escaping closure๋ก ์ ์ธํ๋ผ๊ณ ํ๋ค์!
์ด ์๋ฌ๋ฅผ ํตํด ์ ์ ์๋ ๊ฒ์
Swift์์ ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ ํด๋ก์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํจ์ ๋ด๋ถ scope ์์์๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋๋ค.
์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋ก์ (non-escaping closure)๋ ํจ์๋ฅผ ํ์ถํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ฆ, ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ ํด๋ก์ ๋ ์ฒซ๋ฒ์งธ ์์์ ๊ฐ์ด ์ง์ ํธ์ถ์ ๊ฐ๋ฅํ์ง๋ง,
๋๋ฒ์งธ ์์์ฒ๋ผ ์ธ๋ถ ๋ณ์๋ ์์์ ์ ์ฅํด์ ํจ์ ๊ตฌ๋ฌธ ๋ฐ ๋ค๋ฅธ ๊ณณ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค!
๋ํ, ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋๋ ํด๋ก์ ๋ ํด๋น ํจ์๊ฐ ๋ฆฌํด๋๊ธฐ ์ด์ ์ ์คํ์ด ๋ฉ๋๋ค.
์ฆ, ํจ์๊ฐ ๋ฐํ๋์ด ์ข ๋ฃ๋ ํ์๋ ํด๋น ํด๋ก์ ๊ฐ ์คํ๋ ์ ์๋ค๋ ๋ป์ ๋๋ค!
์ด์ ์์์ ๋ค์๋ ์๋ฌธ์ด ํด๊ฒฐ๋์๋์? ํ์ถ ๊ฐ๋ฅํ ํด๋ก์ ? ์ด๋๋ฅผ ํ์ถํ๋ค๋๊ฑฐ์ง??
ํจ์๋ฅผ ํ์ถํด์ ํจ์ ๊ตฌ๋ฌธ ๋ฐ์์ ์ฌ์ฉํ ์ ์๋ ํด๋ก์ ๊ฐ ๋ฐ๋ก ํ์ถ ํด๋ก์ , Escaping Closure ์ ๋๋ค!!
ํ์ถ ํด๋ก์ ์ ํ์ฉ
๊ทธ๋ ๋ค๋ฉด, ํ์ถ ํด๋ก์ ๋ ์ด๋ป๊ฒ ์ฌ์ฉํ๊ณ ์ด๋ค ์ํฉ์์ ํ์ฉํ ์ ์์๊น์??
์ด ๋ํ ์์ ์ฝ๋๋ก ์์๋ด ์๋ค!๐๐
iOS ๊ฐ๋ฐ์ ํ๋ฉฐ ๋คํธ์ํฌ ํต์ ์ ํด๋ณด์ ๋ถ๋ค์ด๋ผ๋ฉด ์๋์ ๊ฐ์ด @escaping์ผ๋ก ์ ์ธ๋ ํด๋ก์ ๋ฅผ ๋ง์ด ๋ณด์ จ์๊ฑฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค!

์ด๋ ๊ฒ ์์ @escaping์ด ๋ถ์ ํด๋ก์ ๊ฐ Escaping Closure(ํ์ถ ํด๋ก์ )์ ๋๋ค.

์์์ ์๋ฌ ๋ฉ์์ง๊ฐ ๋ด์๋ ์์ ์ฝ๋์์๋ Fix๋ฅผ ํด๋ฆญํ๋ฉด ์์ ๊ฐ์ด ๋ฐ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋๋ฐ์,
์ด๋ ๊ฒ ํด๋ก์ ์์ @escaping๋ง ๋ถ์ฌ์ฃผ๋ฉด ํด๋ก์ ๋ ํ์ถ ๊ฐ๋ฅํ ์ํ๊ฐ ๋ฉ๋๋ค!
escaping closure ๋ง๋๋ ๋ฐฉ๋ฒ, ์ ๋ง ์ฝ์ฃ ??
ํด๋ก์ ๊ฐ ํจ์๋ก๋ถํฐ ํ์ถ(escape)ํ๋ค๋ ๊ฒ์ ํด๋น ํจ์์ ์ธ์๋ก ํด๋ก์ ๊ฐ ์ ๋ฌ๋์ง๋ง, ํจ์๊ฐ ๋ฐํ๋ ํ ์คํ๋๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
ํจ์์ ์ธ์๊ฐ ํจ์์ ์์ญ์ ํ์ถํ์ฌ ํจ์ ๋ฐ์์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฐ๋ ์ ๊ธฐ์กด์ ์ฐ๋ฆฌ๊ฐ ์๊ณ ์๋ ๋ณ์/์์์ scope(==๋ฒ์, ์์ญ) ๊ฐ๋ ์ ๋ฌด์ํฉ๋๋ค.
์๋ํ๋ฉด ํจ์์์ ์ ์ธ๋ ๋ก์ปฌ ๋ณ์, ์์๊ฐ ๋ก์ปฌ์ ์์ญ์ ๋ฐ์ด๋์ด ํจ์ ๋ฐ์์๋ ์ ํจํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฐ๋ผ์, ํด๋ก์ ๋ฅผ ํ์ถ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๋ฉด ๊ฐ๋ฅํ ๊ฒ์ ํฌ๊ฒ 2๊ฐ์ง ์ ๋๋ค.
1๏ธโฃ ํด๋ก์ ๋ฅผ ์ธ๋ถ ๋ณ์/์์์ ์ ์ฅ ๊ฐ๋ฅํฉ๋๋ค.
2๏ธโฃ ํจ์๊ฐ ๋ฐํ๋์ด ์ข ๋ฃ๋ ์ดํ์๋ ํด๋ก์ ์คํ์ด ๊ฐ๋ฅํฉ๋๋ค.
ํจ์ ์ข ๋ฃ ์, ๋ด๋ถ์ ํด๋ก์ ๋ ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์ง๋ง
@escaping์ ์ด์ฉํด ํ์ถ ํด๋ก์ ๋ก ์ ์ธํ ๊ฒฝ์ฐ, ํด๋น ํด๋ก์ ๋ง์ ์ํด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ง๋ค๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํจ์ ์ธ๋ถ์์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค!
์์ ๊ฐ์ ํ์ถ ํด๋ก์ ์ ํน์ง์ ์๋ฒ ํต์ ์, ๋น๋๊ธฐ์ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ ๋ฑ ๋ค์ํ ์ํฉ์์ ์ ์ฉํ๊ฒ ํ์ฉ๋ ์ ์์ต๋๋ค.
์๋ฒ ํต์ ์ ํ์ถ ํด๋ก์ ๋ฅผ Completion Handler๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๊ฐ์ฅ ๋ํ์ ์ธ ํ์ฉ ์์๋ผ๊ณ ์๊ฐํ๋๋ฐ์!
์์ ์์๋ฅผ ๋ค์ ๊ฐ์ ธ์ ์์ธํ ์ค๋ช ํด๋ณด๋๋ก ํ ๊ฒ์!

์์ ์ฝ๋๋ moya๋ผ๋ ํต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด ์์ฑํ API ์ฝ๋์ธ๋ฐ์!
๊ฒ์๊ธ ์ธ๋ค์ผ ํด๋ฆญ ์, ์ด ํจ์๋ฅผ ํธ์ถํด ํด๋น ํฌ์คํธ์ ์์ธ ๋ด์ฉ์ ์กฐํํ ์ ์๋๋ก ํ๊ธฐ ์ํด ํต์ ๋ถ๋ฅผ ์ง์ค ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ์ Completion Handler๋ก ํ์ถ ํด๋ก์ ๊ฐ ์ฌ์ฉ๋๋ ๊ฒ์ ๋ณด์ค ์ ์๋๋ฐ์,
๋จผ์ Completion Handler์ ๋ํด ๊ฐ๋จํ ์ค๋ช ํ๊ณ ๋์ด๊ฐ์๋ฉด!
Completion Handler๋ '์๋ฃ + ๋ด๋น์' ๋ก ์ง์ญํ ์ ์๋ฏ์ด ์ด๋ ํ ์ผ์ด ๋๋ฌ์ ๋ ์งํํ ์ ๋ฌด๋ฅผ ๋ด๋นํฉ๋๋ค.
ํ์ถ ํด๋ก์ ๋ ํจ์ ์ข ๋ฃ ์ดํ์ ์คํ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ Completion Handler๋ก ๋ง์ด ์ฌ์ฉ์ด ๋๋๊ฒ์ด์ฃ !!
์์ ์ฝ๋๋ฅผ ๋ฏ์ด๋ณด์๋ฉด, ์๋น์ค ํ์ผ์ ์ ์๋ getReviewPostDetail์ด๋ผ๋ ํต์ ์ ์์ฒญํ๊ณ
ํต์ ์ ๊ฒฐ๊ณผ๋ฌผ์ result๋ผ๋ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ success, failure ๋ผ๋ ๊ฐ ์ผ์ด์ค์ ํด๋นํ๋ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๊ณ ์์ต๋๋ค.
์ด๋, ์๋ฒ ํต์ ์ ์ฑ๊ณตํ๊ธฐ๋ง ํ๋ฉด(statusCode์ ์๊ด์์ด) result๊ฐ์ .success์ ๋๋ค.
์ฆ, ์๋ฒ ํต์ ์์ฒด์ ์คํจํ์ ๊ฒฝ์ฐ๋ง .failure๊ฐ ๋๋ ๊ฒ์ด์ฃ !
๊ทธ๋์ .success์ธ ๊ฒฝ์ฐ(==์๋ฒ ํต์ ์ ์ฑ๊ณตํ์ ๊ฒฝ์ฐ), statusCode์ ๋ฐ๋ผ ์ธ๋ถ์ ์ธ ์ฑ๊ณต ์คํจ ์ฌ๋ถ๋ฅผ ํ๋จํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ด๋ฅผ ์ํด์ getReviewPostDetailJudgeData()๋ผ๋ ํจ์๋ฅผ ํธ์ถํด์ฃผ๋ ๊ฒ์ ๋๋ค.

getReviewPostDetailJudgeData()์์๋ ์์ ๊ฐ์ด statusCode์ ๋ฐ๋ผ NetWorkResult๋ฅผ ๋ฐํํด์ค๋๋ค.
์ด๋, ์ฑ๊ณต ์์ decode๋ data๋ฅผ ๊ฐ์ด ๋ฐํํด์ฃผ๊ณ ์๋ ๊ฒ์ ํ์ธํ์ค ์ ์์ต๋๋ค.
์์ ํต์ ๋ถ ์ฝ๋์์ completion์ด ํ์ถ ํด๋ก์ ๋ก ์ ์ธ๋์ด ์๊ธฐ ๋๋ฌธ์
์๋ฒ์์ result๋ฅผ ๋ฐ์์ค๋ ์์ ์ด ๋๋ฌ์ ๋, ์ด๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค!
๋ง์ฝ, ์ฌ๊ธฐ์ ํ์ถ ํด๋ก์ ๋ฅผ ์ฌ์ฉํด์ฃผ์ง ์๋๋ค๋ฉด?
์๋ฒํต์ ์ด ๋๋๋ฉด ํจ์๊ฐ ์ข ๋ฃ๋๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ์ธ๋ถ์ ์ธ ์ฑ๊ณต ์คํจ ์ฌ๋ถ๋ฅผ ํ๋จํ์ฌ ์๋ฒ์์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํด์ง๊ฒ ๋ฉ๋๋ค.
์ด์ escaping closure๋ฅผ ์ด๋ค ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋์ง, ์ ์ฌ์ฉํ๋์ง ๊ฐ์ด ์ข ์กํ์๋์~?
์ด๋ ๊ฒ ์๋ฒ ํต์ ์ ๋ฟ๋ง ์๋๋ผ,
๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ๋ ํจ์ ์ข ๋ฃ ์งํ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ์ํด ํ์ถ ํด๋ก์ ๊ฐ ์ ๋ง ๋ง์ด ์ฌ์ฉ๋๋
์ ์ดํดํด๋๋ฉด ์ ๋ง ์ ์ฉํ ๊ฒ ๊ฐ์ต๋๋ค!
์ฐธ๊ณ ์๋ฃ
https://i-colours-u.tistory.com/17?category=893082
[Swift] escaping closure๋? (ํ์ถ ํด๋ก์ )
์ฌ๋ฌ๋ถ๋ค์ ํน์ ํต์ ์ด๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ๋ ์ฝ๋๋ฅผ ์์ฑํ ๋, ์ด๋ฐ์์ผ๋ก completion ํด๋ก์ ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์์ฑํ์ จ์ง ์๋์?! ์์ @escaping ์ด ๋ถ์ด์๋ ๋ชจ์ต์ ํ์ธ ํ ์ ์๋๋ฐ์. ์ด๋ฒ์
i-colours-u.tistory.com
https://dongminyoon.tistory.com/14
[SWIFT] Escaping Closure(ํ์ถ ํด๋ก์ )
ํด๋ก์ ์ ๊ธฐ๋ณธ์ ๋ํด ํฌ์คํ ์ ํ ์ ์ด ์์๋๋ฐ์. ์ด๋ฒ์๋ ํด๋ก์ ํ์ฉ์ ๋ํด ํฌ์คํ ์ ํด๋ณผ๊ฒ์. ์ด์ ํฌ์คํ ์ ์๋ณด์ ๋ถ์ ๋ณด๊ณ ์ค์๋ฉด ์ข์ ๊ฒ ๊ฐ์์. [SWIFT] Closure(ํด๋ก์ ) (1/2) ์ค๋์
dongminyoon.tistory.com
https://osoomoovo.tistory.com/175
[iOS/Swift] Closure์ ๋ํด ์์๋ณด์
์๋ ๊ธ๋ค์ ์ฐธ๊ณ ํ๋ฉฐ ์ ๋ฆฌํ์ต๋๋ค - Closures - Dive in Closure ๋ค์ด๊ฐ๋ฉฐ ํด๋ก์ ๋ ์ด๋ฅธ๋ฐ ์ด๋ฆ ์๋ ํจ์, โ์ต๋ช ํจ์"๋ก ๋ถ๋ฆฌ๋ ์ฝ๋๋ธ๋ญ์ ๋๋ค. ์ด๋ฒ ๊ฒ์๊ธ์์๋ iOS ๊ฐ๋ฐ์ ํ๋ฉฐ ์ ~๋ง์ ๋ง
osoomoovo.tistory.com