- Escaping ํด๋ก์ (@escaping)
- Escaping Closure(ํ์ถ ํด๋ก์ )
- [Swift] @escaping closure, ํ์ถ ํด๋ก์ ์ฝ๊ฒ ์ดํดํ๊ธฐ
Escaping Closure(@escaping
) : ํด๋ก์ ๊ฐ ํจ์์ ์ธ์๋ก ์ ๋ฌ ๋์ ๋, ํจ์์ ์คํ์ด ์ข
๋ฃ๋ ํ ์คํ๋๋ ํด๋ก์ .
func runClosure(closure: () -> Void) {
closure()
}
- ํด๋ก์ ๊ฐ
runClosure()
ํจ์์closure
์ธ์๋ก ์ ๋ฌ๋จ - ํจ์ ์์์
closure()
๊ฐ ์คํ๋จ runClosure()
ํจ์๊ฐ ๊ฐ์ ๋ฐํํ๊ณ ์ข ๋ฃ๋จ
class ViewModel {
var completionhandler: (() -> Void)? = nil
func fetchData(completion: @escaping () -> Void) {
completionhandler = completion
}
}
- ํด๋ก์ ๊ฐ
fetchData()
ํจ์์completion
์ธ์๋ก ์ ๋ฌ๋จ - ํด๋ก์
completion
์ดcompletionhandler
๋ณ์์ ์ ์ฅ๋จ fetchData()
ํจ์๊ฐ ๊ฐ์ ๋ฐํํ๊ณ ์ข ๋ฃ๋จ- ํด๋ก์
completion
์ ์์ง ์คํ๋์ง ์์
class Myclass {
var x = 10
func callFunc() {
withEscaping { self.x = 100 }
withoutEscaping { x = 200 }
}
var completionHandlers: [() -> Void] = []
func withEscaping(completion: @escaping () -> Void) {
completionHandler.append(completion)
}
func withoutEscaping(completion: () -> Void) {
completion()
}
}
&
let mc = MyClass()
mc.callFunc() // 1.
print(mc.x) // 2. result:200
mc.completionHandlers.first?()
print(mc.x) // 3. result:100
- ํด๋์ค ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ callFunc() ํธ์ถ
- @escaping๋ก ๋ช
์ํด์ฃผ์ง ์์๋ withoutEscaping ๋ฉ์๋๊ฐ ํด๋ก์ ๋ฅผ ๋ฐ๋ก ํธ์ถํ๋ฏ๋ก 200 ์ถ๋ ฅ
- ์ด๋ @escaping์ผ๋ก ๋ช ์ํด๋ ๋ฉ์๋์์๋ ํด๋ก์ ๋ฅผ completionHandler์ appendํ์ฌ ์ ์ฅ
- completionHandler ๋ฐฐ์ด์ ์ ์ฅํด๋ ๊ฐ์ฅ ์์ ์๋ ํด๋ก์ ๋ฅผ ํธ์ถํ์ฌ ๊ทธ์ ์์ผ 100 ์ถ๋ ฅ
์ด์ฒ๋ผ ํ์ถ ํด๋ก์ ๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋ก์ ๋ฅผ ํจ์ ๊ตฌ๋ฌธ ๋ฐ์์๋ ํธ์ถ ํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
๐ ํ์ถ ํด๋ก์ ๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์๋ ๊ผญ @escaping์ผ๋ก ๋ช ์ํด์ฃผ์ด์ผ ํ๋ค. ํ์ง๋ง ๋ช ์ํด๋๊ณ Non-Escaping ํด๋ก์ ๋ฅผ ์ฌ์ฉํด๋ ์๊ด ์๋ค.
๊ทธ๋ฌ๋ฉด ๊ทธ๋ฅ @escaping ์ ์ธ์ ํญ์ default๋ก ํด๋๋ฉด ๋ ๋ค ์ฌ์ฉํ ์ ์์ผ๋ ๋ ์ข์ง ์์๊น?
๊ตณ์ด Non-Escaping, Escaping์ผ๋ก ๋๋๋ ์ด์
๋ฐ๋ก ์ปดํ์ผ๋ฌ์ ํผํฌ๋จผ์ค์ ์ต์ ํ ๋๋ฌธ์ด๋ค.
Non-Escaping ํด๋ก์ ์ ๊ฒฝ์ฐ, ์ปดํ์ผ๋ฌ๊ฐ ํด๋ก์ ์ ์คํ ์ข ๋ฃ ์์ ์ด ์ธ์ ์ธ์ง ์๊ธฐ ๋๋ฌธ์ ๋์ ๋ฐ๋ผ ํน์ ๊ฐ์ฒด์ ๋ํ retain, release์ ์ฒ๋ฆฌ๋ฅผ ์๋ตํ์ฌ life-cycle์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค.
ํ์ง๋ง Escaping ํด๋ก์ ๋ ํจ์์ ๋ฐ์์ ์คํ ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ํด๋ก์ ์์ ์ฌ์ฉํ๋ ๊ฐ์ฒด์ ๋ํ ์ถ๊ฐ์ ์ธ ์ฐธ์กฐ์ธ์ดํด(reference cycles) ๊ด๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค.
์ด๋ฌํ ์ด์ ๋ก Swift์์๋ ํ์์์๋ง Escapingํด๋ก์ ๋ฅผ ์ฌ์ฉํ๋๋ก ๊ตฌ๋ถ๋์ด ์๋ค!