ํฐ์คํ ๋ฆฌ ๋ทฐ
[์ค์ํํธ(Swift) ํ๋ก๊ทธ๋๋ฐ] - Escaping Closures(ํ์ถ ํด๋ก์ )
B_log 2021. 5. 11. 14:37๐ Escaping Clousures
- Apple์ iOS Dev Tutorial์ ์งํํ๋ค๊ฐ @escaping์ ์ฒ์ ์๊ฒ ๋์์ต๋๋ค. ํํ ๋ฆฌ์ผ์์์๋ ๊ฐ๋ตํ๊ฒ ๊ฐ๋ ์ ์๊ฐํด์ฃผ๊ณ ์์ง๋ง ์กฐ๊ธ ๋ ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค!
๐ง Escaping vs Non-escaping
์ฐ์ escaping์ ์ดํดํ๊ธฐ ์ํด escaping๊ณผ non-escaping์ ์ฐจ์ด๋ฅผ ์ ํ์๊ฐ ์์ต๋๋ค. ์ด๋ฐ ๊ณ ๋ฏผ์ ํ๋ ์ํฉ์ ๋ํ์ ์ธ ์์๋ก ํด๋ก์ ๊ฐ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ ฅ๋๋ ๋ฉ์๋๋ฅผ ์๊ฐํด๋ณด๊ฒ ์ต๋๋ค.
func callback(someFunction: () -> Void) { someFunction() } callback { print ("someFunction์ด ์คํ๋์์ต๋๋ค."ใ } // ์คํ๊ฒฐ๊ณผ: "someFunction์ด ์คํ๋์์ต๋๋ค." ์ถ๋ ฅ
callbackํจ์๋ฅผ ์ ์ธํ๊ณ ํ๋ผ๋ฏธํฐ๋ก someFunction์ ์ ๋ ฅ๋ฐ๋ ํจ์์ ๋๋ค. ์๋์ callback์ ํ๋ผ๋ฏธํฐ๊ฐ ํด๋ก์ ํ๊ฐ์ธ trailing์ ์ฌ์ฉํ์ฌ ์คํ๋๊ณ ์์ต๋๋ค. ์์ ์ฝ๋๋ ๋ฌธ์ ๊ฐ ์๋ ์ผ๋ฐ์ ์ธ ๊ตฌํ์ ๋๋ค. ์ด๊ฒ์ ์กฐ๊ธ ๋ฐ๊ฟ๋ณด๊ฒ ์ต๋๋ค.
func callback(someFunction: () -> Void) { let bucket = someFunction // ๋จ์ ์คํ์ด ์๋ ์์์ ํด๋ก์ ๋ฅผ ํ ๋น bucket() // ํ ๋น๋ ์์๋ฅผ ์คํ }
๋ณ๊ฒฝ์ ์ ๋จ์ํ ์ ๋ ฅ๋ฐ์ ํจ์ ํด๋ก์ ๋ฅผ ์คํํ๋ ๊ฒ์ด์๋๋ผ ์ด ํด๋ก์ ๋ฅผ ์์(๋๋ ๋ณ์)์ ํ ๋นํด ๊ทธ ์์๋ฅผ ์คํ์ํค๋ ๊ตฌ์กฐ ๋ฐ์ ์์ต๋๋ค. ํด๋ก์ ๋ ์ผ๊ธ ๊ฐ์ฒด์ด๋ฏ๋ก ํ ๋นํ๋ ๋ก์ง์๋ ๋ฌธ์ ๊ฐ ์์ง๋ง, ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ค๋ฅ ๋ฉ์ธ์ง๋ ์๋์ ๊ฐ์ต๋๋ค.
Non-escaping parameter 'someFunction' may only be called
'Non-escaping' ํ๋ผ๋ฏธํฐ์ธ someFunction์ ํธ์ถ๋ฐ์ ๋์ง ์๋๋ค๋ ๋ฉ์ธ์ง์ ๋๋ค. ์ฆ, ํ ๋น์ ํ ์ ์๋ค๋ ๊ฒ์ด์ฃ . ์คํ๋ง ํ ์ ์๊ณ ๋์ ์ ํ ์ ์๋ค๋ ๊ฒ์ ์ดํดํ๊ธฐ ์ํด์๋ ์ฐ์ ์ธ์๊ฐ์ผ๋ก ์ ๋ฌ๋๋ ํด๋ก์ ์ ํน์ฑ์ ์ดํดํด์ผ ํฉ๋๋ค.
๐Closure as a parameter
์ค์ํํธ์์ ํจ์์ ์ธ์๊ฐ์ผ๋ก ์ ๋ฌ๋ ํด๋ก์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ถ๋ถ๊ฐ(Non-escape)์ํ๋ฅผ ๊ฐ์ต๋๋ค. ์์ ์์์์ ์ค๋ฅ๋ ๋น์ฐํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ด๊ธฐ ๋๋ฌธ์ด์ฃ ! Non-escapeํ๋ค๋ ๊ฒ์ ๋ค์์ ๋ ์๋ฏธ๋ฅผ ๊ฐ์ต๋๋ค.
ํจ์ Scope ๋ด์์ ์ฌ์ฉ
(ํ ๋น์ด ์๋) ์ง์ ์คํ์ ์ํด์๋ง ์ฌ์ฉ
์์ ์กฐ๊ฑด์ด ๊ธฐ๋ณธ ์ธํ ์ด๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ๋ฐ์ ์์์ต๋๋ค.
๐ง ์ ์กฐ๊ฑด์ด ๋ถ๋๊ฐ?
๋ง์ฝ ์์ ์กฐ๊ฑด์ด ์์ด ํ ๋นํ๋ ๊ฒ์ ํ๋ฝํ๋ค๋ฉด ๋ด๋ถ ํจ์๋ฅผ ํตํ ์บก์ฒ(Capture)๋ฅผ ํตํด ํด๋ก์ ๊ฐ ํจ์ ๋ฐ๊นฅ์ผ๋ก ํ์ถํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๊ฐํด๋ณด๋ฉด Swift์์ ํ๋ผ๋ฏธํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์์ด๋ฉฐ ํจ์ Scope์์ ์ฌ์ฉ๊ฐ๋ฅํ ๊ตฌ์กฐ์ ๋๋ค. ํ์ง๋ง ํด๋ก์ ์ ํ ๋น์ ํ์ฉํ๋ฉด ์ด Scope๋ฅผ ๋ฒ์ด๋ ์ฌ์ฉ ๊ฐ๋ฅํด์ง๋ค๋ ๊ฒ์ด์ฃ .
๐จ How to Escape?
- ๊ทธ๋ผ ํ์์ ๋ฐ๋ผ ๋์ ํ๊ฑฐ๋ ์ค์ฒฉํจ์ ๋ด๋ถ์์ ์ฌ์ฉํด์ผํ ๋๋ ์ด๋ป๊ฒ ํด์ผํ ๊น์? ๊ฐ๋จํ ๋งํ๋ฉด, ํ์ถ(Escaping)ํ๊ณ ์ถ์๋? ๋ฐฉ๋ฒ์ ๊ฐ๋จํฉ๋๋ค. ํจ์ ์ ์์ ํ์ถ์ํค๊ณ ์ถ์ ํด๋ก์ ํ๋ผ๋ฏธํฐ ์์ @escaping์ ๋ถ์ด๋ฉด ๋ฉ๋๋ค. 2๊ฐ์ง ์ ์ฝ์กฐ๊ฑด์ด ์ฌ๋ผ์ง๊ฒ ๋๋ ๊ฒ์ด์ฃ .
๐ง ์ ๋ถํธํ Non-escaping์ ๊ธฐ๋ณธ ์ค์ ์ผ๋ก ์ ์ํ์๊น?
ํด๋ก์ ์ ๊ธฐ๋ณธ ์์ฑ์ Non-escaping์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ ์ป์ ์ ์๋ ๊ฐ์ฅ ํฐ ์ฅ์ ์ ์ฑ๋ฅ ํฅ์์ ๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ์ฝ๋๋ฅผ ์ต์ ํํ๋ ๊ณผ์ ์์ ์ด๋ฐ ์ฑ๋ฅ ํฅ์์ ๊ธฐ๋ํ ์ ์์ต๋๋ค. ์ด๋ค ํด๋ก์ ๊ฐ ํ์ถ ๋ถ๊ฐ๋ฅํ์ฌ ์ ์ฝ์กฐ๊ฑด ํ์ ์๋ค๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ๋ ์ด์ ๊ทธ ํด๋ก์ ์ ๊ดํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์์ ์ง์ ๋ถํ ์ผ๋ค์ ๊ด๋ฆฌํ ํ์๊ฐ ์๋ ๊ฒ์ด์ฃ .
์ข ๋ ํ์ด์ ์ค๋ช ํด๋ณด๋ฉด, ๋ง์ฝ ์ด๋ค ํด๋ก์ ๊ฐ ๋ฉ์๋ ๋ด์์ ์ฌ์ฉ๋์์ ๋ ์ด ๋ฉ์๋ ์ธ๋ถ์์ ํด๋น ํด๋ก์ ๊ฐ ์ฌ์ฉ๋ ์ ์๋ค๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ ์ด ํด๋ก์ ๋ฅผ ํด๋น ๋ฉ์๋๊ฐ ๋์ํ ๋์๋ง ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ง๊ณ ์์ผ๋ฉด ๋ฉ๋๋ค. ํ๋ผ๋ฏธํฐ๋ก ์ ๋ ฅ๋ฐ์ ํด๋ก์ ๊ฐ ํจ์ ์ธ๋ถ์์๋ ์ฌ์ฉ๋ ์ ์๋ค๋ฉด ์ธ์ ์ฌ์ฉ๋ ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ์์์ ํจ๋ถ๋ก ์ด ํด๋ก์ ๋ฅผ ์ ๊ฑฐํ ์ ์๋ ๊ฒ์ด์ฃ .
์ถ๊ฐ์ ์ผ๋ก, ํ์ถ๋ถ๊ฐ ํด๋ก์ ๋ ๋ด๋ถ์์ selfํค์๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ํ๋ฉด non-escaping์ด๋ฏ๋ก ์ด ํจ์๊ฐ ๋๋์ ๋ฆฌํด๋๊ธฐ ์ ์ ํธ์ถ๋ ๊ฒ์ด๊ณ , ์ด๋ค ๊ฐ์ฒด์ ์ข ์๋๋์ง ํ์คํ๊ธฐ ๋๋ฌธ์ self ํค์๋๋ฅผ ์ฌ์ฉ๊ฐ๋ฅํ ๊ฒ์ด์ฃ . ๊ทธ๋์ ํด๋ก์ ๋ด์์ self์ ๋ํ ์ฝํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค.
ref: ๊ผผ๊ผผํ ์ฌ์์จ์ Swift ๋ฌธ๋ฒํธ
'iOS ์ฑ๊ฐ๋ฐ > Swift Basic' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- django
- ํ ๋งํ #๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ๋ฐฐ์ดํฉ์น๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
- ๋ณ๋ ๋์ดํธ#BOJ#ํ์๋ฒ#Python
- ์ฌ์๊ฐ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ๋ฆฌ๋ชจ์ปจ#์์ ํ์#BOJ#Python
- Brackets#Stacks and Queues#Codility#Python
- django#slicing
- Distinct#Codility#Python
- ๊ณต์ ๊ธฐ ์ค์น#BOJ#์ด๋ถํ์#Python
- NumberofDiscIntersections#Codility#Sort#Python
- ๋๋ฌด์๋ฅด๊ธฐ#BOJ#์ด๋ถํ์#Python
- API#lazy#
- ์์ด์ฌ์ดํด#BOJ#Python
- PassingCars#Codility#Python
- Swift#Tuples#Range
- ํฐํ๋น์น#๋ฆฌ์ฝ#xbox#controller
- ์ํธ์ฝ๋#dp#BOJ#Python
- filter#isalnum#lower
- ๋์ ์๋ฅด๊ธฐ#์ด๋ถํ์#BOJ#Python
- ๋ฏธ๋ก ํ์#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ๋ฐฑ์ค ์๊ณ ๋ฆฌ์ฆ#BackTracking
- ์ข ์ด์๋ฅด๊ธฐ#๋ถํ ์ ๋ณต#BOJ#Python
- Triangle#Sorting#Codility#Python
- ํ์ด์ฌ์๊ณ ๋ฆฌ์ฆ์ธํฐ๋ทฐ#4์ฅ
- ๋ ์ง ๊ณ์ฐ#BOJ#์์ ํ์#Python
- ์ฟผ๋ํธ๋ฆฌ#BOJ#๋ถํ ์ ๋ณต#Python
- ํ ํ๋ก์ ํธ#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- ๋ฐ๋ณต์์ด#๋ฐฑ์ค์๊ณ ๋ฆฌ์ฆ#Python
- N์ผ๋ก ํํ#DP#Programmers#Python
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |