์ดํธ๋ฆฌ๋ทฐํธ ์ฌ์ ์ ๋ง๋ค๊ฒ ๋ค. ๊ณ์ํด์ ์ด ๊ธ์ ์ ๋ฐ์ดํธ ํ๊ฒ ๋ค.
์ฝ๋ฉ์ ์ด๋ป๊ฒ ๋ณด๋ฉด ์ปดํ์ผ๋ฌํํ ๊ตฌ์ฒด์ ์ธ ์์ ์ ์ ๋ ฅํด์ ๋ช ๋ นํ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
๊ทผ๋ฐ '์ ์ด ์ผ์ ์ข ํน๋ณํ ํด์ค์ผ๋๋๋ฐ?'
์ข ๊ธํ๊ฒ ์ฒ๋ฆฌํด์ฃผ์ธ์ ๐๐ปย
์ข ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํด์ผ๋ฉ๋๋ค ๐๐ป ํ ๋
@ ๊ณจ๋ฑ ์ด ๋ค์ attribute๋ฅผ ์ด๋ค.
์ค๋์ ์ ๋ง ํํ attribute @escaping์ ๋ํด ์์๋ณด์.
โ ํจ์ ๋ฐ์์๋ ์ฌ์ฉํ ์ ์๊ฒ ํด๋ฌ๋ผ!๋ผ๋ ํ์
โ ํด๋ก์ ๊ฐ ํจ์์ ๋ฒ์๋ฅผ ๋ฒ์ด๋์ ์ฌ์ฉ๋ ์ ์๋๋ก!
Swift์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํจ์์ ํ๋ผ๋ฏธํฐ๊ฐ non-escaping์ด๋ค. ํด๋น ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ ํจ์๋ ๊ทธ ํจ์๊ฐ ๋๋๊ธฐ ์ ์๋ง ํธ์ถ๋์ด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
ใ ใ ใ
๐ ๊ทธ๋ฌ๋๊น!!
๋ณดํต ํจ์๋ ์์๋๊ณ ๋๋๋ ๋์์๋ง ์๋ํ๋๋ฐ, ๋๋๋ก ์ด๋ค ์ผ์ด ๋๋๊ณ ๋์๋ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ค๋ค์ผ ํ ๋๊ฐ ์๋ค.
๊ทธ๋์ ์ด๋ฐ ๋น๋๊ธฐ ์์ ์ ์ํํ ๋๋ ์์ ์ด ๋๋๋ ์๊ฐ์ด ํจ์์ ์คํ ์๊ฐ๋ณด๋ค ๊ธธ ์ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ, ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ ํจ์๋ฅผ ํจ์ ์ธ๋ถ์์ ๋์ค์ ํธ์ถํด์ผ ํ ํ์๊ฐ ์๋ค. ์ด ๋ @escaping ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ํจ์๋ฅผ ๋์ค์ ํธ์ถํ ์ ์๊ฒ ํ๋ค.
๐ง๏ธ ์๋ฅผ ๋ค์ด์, ๋ ์จ api๋ฅผ ๋ฐ์์จ๋ค๊ณ ํ ๋,
์ ๋ณด๋ฅผ ๋ชจ๋ ๋ฐ์์ค๊ธฐ๋ ์ ์ ํจ์๊ฐ ๋๋ ์ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์ @escaping ํค์๋๋ฅผ ์ฌ์ฉํด์ ์ด ํจ์๊ฐ ๋๋๊ณ ๋์๋ ์ด ํจ์๋ฅผ ์ฌ์ฉํ ๊ฑฐ๋ค๋ฅผ ์๋ฆฌ๋ ๊ฒ์ด๋ค!
๋คํธ์ํฌ ์์ฒญ์ด ์๋๋๋ผ๋, ๋น๋๊ธฐ ์์ (์ ์ ์ ๋ ฅ์ ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋, ์ผ์ ์๊ฐ ํ์ ์์ ์ ์คํํด์ผ ํ๋ ๊ฒฝ์ฐ), ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ์ฝ๋ฐฑ์ ์ค์ ํ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ค.
๊ณฐํ๊น๋์ RxSwift 4์๊ฐ ๊ฐ์๋ฅผ ์ ํฌ๋ธ๋ก ๋ฃ๋ค๊ฐ ์ง๋ฌธ์ ๋ํ ๋๋ต์ผ๋ก ํ์ จ๋ ๊ฒ ๋๋ฌด ๊ฐ๋ ฌํ๊ฒ ๊ธฐ์ต์ ๋จ์์ใ ใ ใ ใ
์ด๋ค ๋ถ์ด โescaping์ ์์ฐ๋ฉด ์ด๋ป๊ฒ ๋๋์?โ๋ผ๊ณ ์ง๋ฌธํ์ จ๋๋ฐ,
๐ป ๊ณฐํ๊น๋์ด โ์๋ฌ๊ฐ ๋์ฃ โํ๊ณ ๋๋ตํ์ ๊ฒ ๋๋ฌด ์๊ฒผ๋ค.
์๋ฌดํผ attribute๋ฅผ ์ฐ๊ณ ์์ฐ๊ณ ๊ฐ ์ด๋ค ์ฐจ์ด๊ฐ ์๋?
func doSomething(completion: () -> Void) {
print("Doing something...")
completion()
print("Done doing something.")
}
โ ํจ์๊ฐ ๋๋๊ธฐ ์ ์ ํด๋ก์ ๊ฐ ๋ฐ๋ก ์คํ๋๋ค.
completion ํด๋ก์ ๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์์, ํจ์ ๋ด์์ ๋ฐ๋ก ์คํํ๋ค.
โ Doing somethingโฆ โ Done doing something.
func doSomethingAsync(completion: @escaping () -> Void) {
DispatchQueue.main.async {
print("Doing something...")
completion()
}
print("function ended, ํด๋ก์ ๋ ์์ง ํธ์ถ๋์ง ์์์ ์๋")
}
doTaskLater(completion: {
print("์์
์ค...")
})
โ ํจ์ ์คํ์ด ๋๋ ํ์๋ ํด๋ก์ ๊ฐ ์คํ๋ ์ ์๋ค.
์ด ์ฝ๋์์๋ completion ํด๋ก์ ๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ง๋ง, @escaping์ด ๋ถ์ด์์.
๊ฒ๋ค๊ฐ ์ด ํด๋ก์ ๋ DispatchQueue.main.async ์์์ ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ฏ๋ก, ํจ์ ์์ฒด๋ ํด๋ก์ ๊ฐ ํธ์ถ๋๊ธฐ ์ ์ ์ข ๋ฃ๋ ์ ์๋ค.
โ function ended, ํด๋ก์ ๋ ์์ง ํธ์ถ๋์ง ์์์ ์๋ โ Doing something... โ ์์ ์ค...
์ฑ ๊ฐ๋ฐ์๋ผ๋ฉด ๋ฐํ๊ฐ์ ์ฌ์ฉํ์ง ์์ ๋ ๋จ๋ ๋ ธ๋ ์๋ฌ๋ฅผ ๋ณธ ์ ์์๊ฑฐ๋ค.
Result of call to 'ํจ์๋ช
()' is unused
์๋ฐ ๋ ธ๋ ์๋ฌ๊ฐ ๋จ๋๋ฐ, ์ ํจ์ ๋ง๋ค์ด๋๊ณ , ๊ฒฐ๊ณผ๊ฐ ์์ฐ๋ ์ด๋ง์ด๋ค.
@discardableResult
func ํจ์๋ช
() -> ๋ฐํ๊ฐํ์
{
์๋ฐ์์ผ๋ก ํจ์ ์์ discardableResult๋ฅผ ์จ์ฃผ๋ฉด, ๊ฒฐ๊ณผ๊ฐ์ ๋ฒ๋ฆด ์ ์๋ค๋ ๋ป์ด ๋๋ค.
๊ทธ๋ฌ๋ฉด ๋
ธ๋์๋ฌ๋ฅผ ์์จ ์ ์๋ฐ.
์ด์ค์ผ์ดํ ์ํ๊ณ ๋ฐํ๊ฐ์ผ๋ก -> Void ๋ฅผ ํด๋ ๋์ง ์์์๊น์ฉ?