[iOS] ๐Ÿ“– @Attribute ์‚ฌ์ „ (@escaping) v.1.0.0

Madeline๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ปยท2024๋…„ 7์›” 12์ผ
1

iOS study

๋ชฉ๋ก ๋ณด๊ธฐ
60/61
post-thumbnail
post-custom-banner

์–ดํŠธ๋ฆฌ๋ทฐํŠธ ์‚ฌ์ „์„ ๋งŒ๋“ค๊ฒ ๋‹ค. ๊ณ„์†ํ•ด์„œ ์ด ๊ธ€์— ์—…๋ฐ์ดํŠธ ํ•˜๊ฒ ๋‹ค.

1. @escaping

์ฝ”๋”ฉ์€ ์–ด๋–ป๊ฒŒ ๋ณด๋ฉด ์ปดํŒŒ์ผ๋Ÿฌํ•œํ…Œ ๊ตฌ์ฒด์ ์ธ ์ž‘์—…์„ ์ž…๋ ฅํ•ด์„œ ๋ช…๋ นํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

๊ทผ๋ฐ '์•„ ์ด ์ผ์€ ์ข€ ํŠน๋ณ„ํžˆ ํ•ด์ค˜์•ผ๋˜๋Š”๋ฐ?'
์ข€ ๊ธ‰ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์ฃผ์„ธ์š” ๐Ÿ™๐Ÿปย 
์ข€ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ๋ฉ๋‹ˆ๋‹ค ๐Ÿ™๐Ÿป ํ•  ๋•Œ

@ ๊ณจ๋ฑ…์ด ๋’ค์— attribute๋ฅผ ์“ด๋‹ค.

์˜ค๋Š˜์€ ์ •๋ง ํ”ํ•œ attribute @escaping์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

@escaping

โ†’ ํ•จ์ˆ˜ ๋ฐ–์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด๋‹ฌ๋ผ!๋ผ๋Š” ํ‘œ์‹œ

โ†’ ํด๋กœ์ €๊ฐ€ ํ•จ์ˆ˜์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก!

Swift์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ non-escaping์ด๋‹ค. ํ•ด๋‹น ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋œ ํ•จ์ˆ˜๋Š” ๊ทธ ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๊ธฐ ์ „์—๋งŒ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

ใ…Žใ…Žใ…Ž

๐Ÿ˜Ž ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ!!

๋ณดํ†ต ํ•จ์ˆ˜๋Š” ์‹œ์ž‘๋˜๊ณ  ๋๋‚˜๋Š” ๋™์•ˆ์—๋งŒ ์ž‘๋™ํ•˜๋Š”๋ฐ, ๋•Œ๋–„๋กœ ์–ด๋–ค ์ผ์ด ๋๋‚˜๊ณ  ๋‚˜์„œ๋„ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค๋ค„์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๋Š” ์ž‘์—…์ด ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์‹œ๊ฐ„๋ณด๋‹ค ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ, ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋œ ํ•จ์ˆ˜๋ฅผ ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ๋‚˜์ค‘์— ํ˜ธ์ถœํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ด ๋•Œ @escaping ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๋‚˜์ค‘์— ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

๐ŸŒง๏ธ ์˜ˆ๋ฅผ ๋“ค์–ด์„œ, ๋‚ ์”จ api๋ฅผ ๋ฐ›์•„์˜จ๋‹ค๊ณ  ํ• ๋•Œ,

์ •๋ณด๋ฅผ ๋ชจ๋‘ ๋ฐ›์•„์˜ค๊ธฐ๋„ ์ „์— ํ•จ์ˆ˜๊ฐ€ ๋๋‚  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์— @escaping ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ด ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๊ณ  ๋‚˜์„œ๋„ ์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ• ๊ฑฐ๋‹ค๋ฅผ ์•Œ๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค!

๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ์•„๋‹ˆ๋”๋ผ๋„, ๋น„๋™๊ธฐ ์ž‘์—…(์œ ์ € ์ž…๋ ฅ์„ ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜, ์ผ์ • ์‹œ๊ฐ„ ํ›„์— ์ž‘์—…์„ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ), ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋‚˜ ์ฝœ๋ฐฑ์„ ์„ค์ •ํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค.

์•ˆ์“ฐ๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋Š”๋ฐ?

๊ณฐํŠ€๊น€๋‹˜์˜ RxSwift 4์‹œ๊ฐ„ ๊ฐ•์˜๋ฅผ ์œ ํˆฌ๋ธŒ๋กœ ๋“ฃ๋‹ค๊ฐ€ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋Œ€๋‹ต์œผ๋กœ ํ•˜์…จ๋˜ ๊ฒŒ ๋„ˆ๋ฌด ๊ฐ•๋ ฌํ•˜๊ฒŒ ๊ธฐ์–ต์— ๋‚จ์•„์„œใ…‹ใ…‹ใ…‹ใ…‹

์–ด๋–ค ๋ถ„์ด โ€œescaping์„ ์•ˆ์“ฐ๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”?โ€๋ผ๊ณ  ์งˆ๋ฌธํ•˜์…จ๋Š”๋ฐ,

๐Ÿป ๊ณฐํŠ€๊น€๋‹˜์ด โ€œ์—๋Ÿฌ๊ฐ€ ๋‚˜์ฃ โ€ํ•˜๊ณ  ๋Œ€๋‹ตํ•˜์‹ ๊ฒŒ ๋„ˆ๋ฌด ์›ƒ๊ฒผ๋‹ค.

์•„๋ฌดํŠผ attribute๋ฅผ ์“ฐ๊ณ  ์•ˆ์“ฐ๊ณ ๊ฐ€ ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ๋‚˜?

non-escaping ํด๋กœ์ €

func doSomething(completion: () -> Void) {
    print("Doing something...")
    completion()
    print("Done doing something.")
}

โ†’ ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๊ธฐ ์ „์— ํด๋กœ์ €๊ฐ€ ๋ฐ”๋กœ ์‹คํ–‰๋œ๋‹ค.

completion ํด๋กœ์ €๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์„œ, ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋ฐ”๋กœ ์‹คํ–‰ํ•œ๋‹ค.

โ‡’ Doing somethingโ€ฆ โ†’ Done doing something.

escaping ํด๋กœ์ €

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... โ†’ ์ž‘์—… ์ค‘...

2. @discardableResult

์•ฑ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋ฐ˜ํ™˜๊ฐ’์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ ๋œจ๋Š” ๋…ธ๋ž€ ์—๋Ÿฌ๋ฅผ ๋ณธ ์  ์žˆ์„๊ฑฐ๋‹ค.

Result of call to 'ํ•จ์ˆ˜๋ช…()' is unused

์š”๋Ÿฐ ๋…ธ๋ž€ ์—๋Ÿฌ๊ฐ€ ๋œจ๋Š”๋ฐ, ์™œ ํ•จ์ˆ˜ ๋งŒ๋“ค์–ด๋†“๊ณ , ๊ฒฐ๊ณผ๊ฐ’ ์•ˆ์“ฐ๋ƒ ์ด๋ง์ด๋‹ค.

@discardableResult
    func ํ•จ์ˆ˜๋ช…() -> ๋ฐ˜ํ™˜๊ฐ’ํƒ€์ž… {

์š”๋Ÿฐ์‹์œผ๋กœ ํ•จ์ˆ˜ ์•ž์— discardableResult๋ฅผ ์จ์ฃผ๋ฉด, ๊ฒฐ๊ณผ๊ฐ’์€ ๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด ๋œ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด ๋…ธ๋ž€์—๋Ÿฌ๋ฅผ ์—†์•จ ์ˆ˜ ์žˆ๋”ฐ.

profile
๐ŸŽ Apple Developer Academy@POSTECH 2๊ธฐ, ๐Ÿ€ SeSAC iOS 4๊ธฐ
post-custom-banner

2๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2024๋…„ 7์›” 15์ผ

์ด์Šค์ผ€์ดํ•‘ ์•ˆํ•˜๊ณ  ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ -> Void ๋ฅผ ํ•ด๋„ ๋˜์ง€ ์•Š์•˜์„๊นŒ์šฉ?

1๊ฐœ์˜ ๋‹ต๊ธ€