λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

🍎 iOS/Swift

[Swift] ν΄λ‘œμ €(Closure)

μ΅œκ·Όμ— iOS μŠ€ν„°λ”” μΉœκ΅¬λ“€κ³Ό ν•¨κ»˜ ν΄λ‘œμ €μ— λŒ€ν•΄ κ³΅λΆ€ν•΄λ³΄μ•˜λŠ”λ°μš”,

λΈ”λ‘œκ·Έμ—λ„ κ·Έ λ‚΄μš©μ„ ν•œλ²ˆ 정리해보렀고 ν•©λ‹ˆλ‹€!😊

데이터 전달, μ„œλ²„ 톡신 λ“± λ‹€μ–‘ν•œ μƒν™©μ—μ„œ μœ μš©ν•˜κ²Œ μ΄μš©κ°€λŠ₯ν•œ ν΄λ‘œμ €μ— λŒ€ν•΄ μ•Œμ•„λ΄…μ‹œλ‹€!!

ν΄λ‘œμ €(Closure)λž€?

ν΄λ‘œμ €λŠ” 일정기λŠ₯을 ν•˜λŠ” μ½”λ“œλ₯Ό ν•˜λ‚˜μ˜ λΈ”λ‘μœΌλ‘œ λͺ¨μ•„놓은 것을 λ§ν•©λ‹ˆλ‹€.

μ‹€ν–‰κ°€λŠ₯ν•œ μ½”λ“œλΈ”λŸ­μ΄λΌκ³ λ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

ν•¨μˆ˜λ„ ν΄λ‘œμ €μ˜ ν•œ ν˜•νƒœμž…λ‹ˆλ‹€. (ν•¨μˆ˜λŠ” 이름이 μžˆλŠ” ν΄λ‘œμ €)

ν΄λ‘œμ €λΌλŠ” κ°œλ… μ•ˆμ— ν•¨μˆ˜κ°€ ν¬ν•¨λ˜λŠ” 것이라고 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

→ ν•¨μˆ˜: Named Closure, μ΄μ™Έμ˜ 일반적인 ν΄λ‘œμ €: (Unnamed) Closure

 

ν΄λ‘œμ €λŠ” μΌκΈ‰κ°μ²΄μ˜ νŠΉμ„±μ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λ³€μˆ˜λ‚˜ μƒμˆ˜μ— λŒ€μž…ν•˜κ³ , λ°˜ν™˜(return) κ°€λŠ₯ν•˜λ©° νŒŒλΌλ―Έν„°λ‘œ 받을 수 μžˆμŠ΅λ‹ˆλ‹€.

즉, μ „λ‹¬μΈμž, λ³€μˆ˜, μƒμˆ˜ 등에 μ €μž₯ 및 전달이 κ°€λŠ₯ν•˜λ‹€λŠ” λœ»μž…λ‹ˆλ‹€!

ν•¨μˆ˜μ™€ λ‹€λ₯΄κ²Œ μ΄λ¦„μ •μ˜κ°€ ν•„μš”ν•˜μ§€λŠ” μ•Šμ§€λ§Œ, λ§€κ°œλ³€μˆ˜ 전달과 λ°˜ν™˜ 값이 μ‘΄μž¬ν•  수 μžˆλ‹€λŠ” 점이 λ™μΌν•©λ‹ˆλ‹€.

ν΄λ‘œμ €. κ·Έκ±° μ–΄λ–»κ²Œ μ“°λŠ”κ±΄λ°..

ν΄λ‘œμ € ν‘œν˜„μ‹

{ (λ§€κ°œλ³€μˆ˜ λͺ©λ‘) -> ReturnType in  // closure head
    μ‹€ν–‰μ½”λ“œ(body)  // closure body
}

 

  • -> 을 μ΄μš©ν•΄ λ°˜ν™˜ νƒ€μž…μ„ λͺ…μ‹œν•©λ‹ˆλ‹€.
  • ν΄λ‘œμ € ν—€λ“œμ™€ ν΄λ‘œμ € λ°”λ””λ₯Ό κ΅¬λΆ„μ§€μ–΄μ£ΌλŠ” 것이 in ν‚€μ›Œλ“œ!

ν•˜μ§€λ§Œ μ΄λ ‡κ²Œλ§Œ λ΄μ„œλŠ” μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€ 아직 감이 잘 μ•ˆμ˜€μ£ ? 저두여..γ…Ž

μ‹€μ œλ‘œ μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€ μ‚¬μš© μ˜ˆμ‹œλ“€μ„ λ³΄λ©΄μ„œ μ΄ν•΄ν•΄λ΄…μ‹œλ‹€!

κΈ°λ³Έ ν΄λ‘œμ €

  • νŒŒλΌλ―Έν„°μ™€ λ¦¬ν„΄νƒ€μž…μ΄ μžˆλŠ” ν΄λ‘œμ €
  • νŒŒλΌλ―Έν„°μ™€ λ¦¬ν„΄νƒ€μž… λ‘˜λ‹€ μ—†λŠ” ν΄λ‘œμ €

1. νŒŒλΌλ―Έν„°μ™€ λ¦¬ν„΄νƒ€μž…μ΄ μžˆλŠ” ν΄λ‘œμ €

μœ„μ—μ„œ ν΄λ‘œμ €λŠ” 일급객체라고 ν–ˆμ Έ?

이λ₯Ό μ‰½κ²Œ λ§ν•˜λ©΄ ν΄λ‘œμ €λŠ” 이름이 μ—†λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€! 

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ•„λž˜μ™€ 같이 μƒμˆ˜μ— ν΄λ‘œμ €λ₯Ό λŒ€μž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

let closure = { (name: String) -> String in
    return "Hello, \(name)"
}

 

But, μ—¬κΈ°μ„œ ν•œκ°€μ§€ μ£Όμ˜ν•  점은!! μ΄λ ‡κ²Œ ν΄λ‘œμ €λ₯Ό λŒ€μž…ν•œ μƒμˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ μž…λ‹ˆλ‹€.

 

closure("jane")
closure(name: "jane") // μ΄λ ‡κ²Œ μ“°λ©΄ μ—λŸ¬λ‚©λ‹ˆλ‹€

 

μœ„μ™€ 같이 ν΄λ‘œμ €λ₯Ό ν˜ΈμΆœν•  λ•ŒλŠ” Argument Label을 μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

즉, 'name'은 였직 Parameter Name으둜만 μ‚¬μš©λ˜λŠ” κ²ƒμž…λ‹ˆλ‹€!

2. νŒŒλΌλ―Έν„°μ™€ λ¦¬ν„΄νƒ€μž… λ‘˜λ‹€ μ—†λŠ” ν΄λ‘œμ €

νŒŒλΌλ―Έν„°μ™€ λ¦¬ν„΄νƒ€μž…μ΄ λ‘˜λ‹€ μ—†λŠ” κ²½μš°μ—λŠ” μš”λ ‡κ²Œ μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

let closure = { () -> () in
    print("Closure")
}

 

Swiftμ—μ„œ ν•¨μˆ˜λŠ” λ¦¬ν„΄νƒ€μž…μ΄ μ—†μœΌλ©΄ μƒλž΅μ΄ κ°€λŠ₯ν•˜μ Έ?

ν΄λ‘œμ €λ„ λ§ˆμ°¬κ°€μ§€λ‘œ μƒλž΅μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

근데!!! ν΄λ‘œμ €λŠ” λ¦¬ν„΄νƒ€μž…μ΄ μžˆμ–΄λ„ μƒλž΅μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

이λ₯Ό μ•”μ‹œμ  λ°˜ν™˜ ν‘œν˜„μ΄λΌκ³  ν•˜λŠ”λ°,

ν΄λ‘œμ €κ°€ λ°˜ν™˜ν•˜λŠ” 값이 μžˆλ‹€λ©΄ ν΄λ‘œμ €μ˜ λ§ˆμ§€λ§‰ μ€„μ˜ 결과값은 

return ν‚€μ›Œλ“œλ₯Ό μƒλž΅ν•˜λ”λΌλ„ μ•”μ‹œμ μœΌλ‘œ λ°˜ν™˜κ°’μœΌλ‘œ μ·¨κΈ‰ν•©λ‹ˆλ‹€.

ν΄λ‘œμ €μ—μ„œ 'μƒλž΅'에 ν•΄λ‹Ήν•˜λŠ” κ²½λŸ‰ 문법에 λŒ€ν•΄μ„œλŠ” λ’€μ—μ„œ 더 닀루도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€!

 

ν΄λ‘œμ €, μ–΄λ–»κ²Œ μ“°λŠ”μ§€ μ‘°κΈˆμ”© 감이 μž‘νžˆλ‚˜μš”?

κ·Έλ ‡λ‹€λ©΄ ν΄λ‘œμ €μ˜ κ°€μž₯ μ€‘μš”ν•œ νŠΉμ§•μ΄λΌκ³  ν•  수 μžˆλŠ” μΌκΈ‰κ°μ²΄μ˜ νŠΉμ§•μ— λŒ€ν•΄ μ •λ¦¬ν•΄λ΄…μ‹œλ‹€.

μΌκΈ‰κ°μ²΄λ‘œμ„œ ν΄λ‘œμ €

  • ν΄λ‘œμ €λ₯Ό λ³€μˆ˜, μƒμˆ˜μ— λŒ€μž…κ°€λŠ₯
  • ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„° νƒ€μž…μœΌλ‘œ ν΄λ‘œμ €λ₯Ό 전달 κ°€λŠ₯
  • ν•¨μˆ˜μ˜ λ°˜ν™˜ νƒ€μž…μœΌλ‘œ ν΄λ‘œμ €λ₯Ό μ‚¬μš©κ°€λŠ₯

1. ν΄λ‘œμ €λ₯Ό λ³€μˆ˜, μƒμˆ˜μ— λŒ€μž…κ°€λŠ₯

μœ„μ—μ„œ μ„€λͺ…ν–ˆλ“―이 ν΄λ‘œμ €λ₯Ό λ³€μˆ˜λ‚˜ μƒμˆ˜μ— λŒ€μž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν΄λ‘œμ €λ₯Ό 선언함과 λ™μ‹œμ— λ³€μˆ˜ or μƒμˆ˜μ— λŒ€μž…ν•  수 있으며,

기쑴에 ν΄λ‘œμ €λ₯Ό λŒ€μž…ν•œ λ³€μˆ˜λ‚˜ μƒμˆ˜λ₯Ό μƒˆλ‘œμš΄ λ³€μˆ˜λ‚˜ μƒμˆ˜μ— λŒ€μž…ν•˜λŠ” 것도 λ‹Ήμ—°νžˆ κ°€λŠ₯ν•©λ‹ˆλ‹€!

 

// ν΄λ‘œμ € μ„ μ–Έκ³Ό λ™μ‹œμ— λŒ€μž…
let closure = { () -> () in
    print("Closure")
}

// μƒˆλ‘œμš΄ λ³€μˆ˜λ‚˜ μƒμˆ˜μ— λŒ€μž…λ„ κ°€λŠ₯ 
let closure2 = closure

2. ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„° νƒ€μž…μœΌλ‘œ ν΄λ‘œμ €λ₯Ό 전달 κ°€λŠ₯

// ν•¨μˆ˜λ₯Ό νŒŒλΌλ―Έν„°λ‘œ μ „λ‹¬λ°›λŠ” doSomethingμ΄λΌλŠ” ν•¨μˆ˜
func doSomething(closure: () -> ()) {
    closure()
}

// ν•¨μˆ˜ 호좜
doSomething(closure: { () -> () in
    print("Hello!") // Hello! 
})

 

doSomething ν•¨μˆ˜λŠ” νŒŒλΌλ―Έν„°λ‘œ ν•¨μˆ˜λ₯Ό μ „λ‹¬λ°›λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

이 경우, νŒŒλΌλ―Έν„°λ‘œ ν•¨μˆ˜λΏλ§Œ μ•„λ‹ˆλΌ ν΄λ‘œμ €λ„ 전달할 수 μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.

3. ν•¨μˆ˜μ˜ λ°˜ν™˜ νƒ€μž…μœΌλ‘œ ν΄λ‘œμ €λ₯Ό μ‚¬μš©κ°€λŠ₯

func doSomething() -> () -> () {
    
    return { () -> () in
        print("Hello!")
    }
}

 

μœ„μ™€ 같이 값을 리턴할 λ•Œλ„, ν•¨μˆ˜λΏλ§Œ μ•„λ‹ˆλΌ ν΄λ‘œμ €λ₯Ό λ°˜ν™˜ν•΄μ€„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

ν΄λ‘œμ €.μ•Œκ² λŠ”λ° μ–΄λ–»κ²Œ μ‹€ν–‰ν•˜λŠ”λ°?

이제 ν΄λ‘œμ €λ₯Ό ν˜ΈμΆœν•΄μ„œ μ‹€ν–‰μ‹œμΌœ λ΄…μ‹œλ‹€!

  • ν΄λ‘œμ €κ°€ λŒ€μž…λœ λ³€μˆ˜λ‚˜ μƒμˆ˜λ‘œ ν˜ΈμΆœν•˜κΈ°
  • ν΄λ‘œμ €λ₯Ό 직접 μ‹€ν–‰ν•˜κΈ°

1. ν΄λ‘œμ €κ°€ λŒ€μž…λœ λ³€μˆ˜λ‚˜ μƒμˆ˜λ‘œ ν˜ΈμΆœν•˜κΈ°

μΌκΈ‰κ°μ²΄μ˜ νŠΉμ§•μ„ μ΄μš©ν•΄ ν΄λ‘œμ €λ₯Ό λ³€μˆ˜λ‚˜ μƒμˆ˜μ— λŒ€μž…ν•˜μ—¬ μ‹€ν–‰μ‹œμΌœμ€„ 수 μžˆμŠ΅λ‹ˆλ‹€!

 

func doSomething() -> () -> () {
    
    return { () -> () in
        print("Hello!")
    }
}

// μ‹€ν–‰
let closure = doSomething()
closure()

 

2. ν΄λ‘œμ €λ₯Ό 직접 μ‹€ν–‰ν•˜κΈ°

ν΄λ‘œμ €λ₯Ό λ³€μˆ˜λ‚˜ μƒμˆ˜μ— λŒ€μž…ν•˜μ§€ μ•Šκ³  직접 μ‹€ν–‰μ‹œν‚€κ³  μ‹Άμ„μˆ˜ μžˆμžλ‚˜μ—¬?

μ΄λ•ŒλŠ” ν΄λ‘œμ €λ₯Ό ( ) μ†Œκ΄„ν˜Έλ‘œ 감싸고, λ§ˆμ§€λ§‰μ— 호좜 ꡬ문인 ()λ₯Ό μΆ”κ°€ν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€!

 

({ () -> () in
    print("Hello!")
})()

ν΄λ‘œμ € κ²½λŸ‰ 문법

ν΄λ‘œμ €κ°€ μ–΄λ €μš΄ 이유 쀑 ν•˜λ‚˜κ°€ μš” κ²½λŸ‰ 문법 λ•Œλ¬Έμ΄λΌκ³  μƒκ°ν•©λ‹ˆλ‹€..

μƒλž΅ν•˜κ³  μƒλž΅ν•˜κ³ ...μ–˜λ„ μƒλž΅ μŸ€λ„ μƒλž΅

ν΄λ‘œμ €λ₯Ό κ°„λ‹¨ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλŠ” κ²½λŸ‰ 문법을 μ •λ¦¬ν•΄λ΄…μ‹œλ‹€!

  • ν›„ν–‰ ν΄λ‘œμ €
  • νŒŒλΌλ―Έν„° ν˜•μ‹κ³Ό 리턴 ν˜•μ‹ μƒλž΅
  • 단좕 인자 이름
  • return ν‚€μ›Œλ“œ μƒλž΅

1. ν›„ν–‰ ν΄λ‘œμ €(Trailing Closure)

ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜ λ§ˆμ§€λ§‰μœΌλ‘œ μ „λ‹¬λ˜λŠ” ν΄λ‘œμ €λŠ” ν›„ν–‰ ν΄λ‘œμ €(Trailing Closure)둜 κ΅¬ν˜„ν•˜μ—¬ 

ν•¨μˆ˜ μ†Œκ΄„ν˜Έ 밖에 ν΄λ‘œμ €λ₯Ό κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ­”μ†Œλ¦¬μ•Ό..ν›„μ—₯

μ˜ˆμ‹œλ‘œ λ΄…μ‹œλ‹€!

 

func doSomething(closure: () -> ()) {
    closure()
}

// 호좜
// ν΄λ‘œμ €κ°€ νŒŒλΌλ―Έν„°μ˜ κ°’ ν˜•μ‹μœΌλ‘œ ν•¨μˆ˜ 호좜 ꡬ문() μ•ˆμ— μž‘μ„±
doSomething(closure: { () -> () in
    print("Hello!")
})

 

μœ„μ—μ„œ ν΄λ‘œμ €κ°€ νŒŒλΌλ―Έν„°λ‘œ 전달될 경우의 μ½”λ“œλ₯Ό 가지고 μ™”μŠ΅λ‹ˆλ‹€!

이 경우 λ§ˆμ§€λ§‰μ— κ΄„ν˜Έλ„ }) μ΄λ ‡κ²Œ λ˜μ–΄ μžˆμ–΄ ν—·κ°ˆλ¦¬κΈ° 쉽고, μ½”λ“œλ₯Ό λ”± 봀을 λ•Œ 해석도 쉽지 μ•ŠμŠ΅λ‹ˆλ‹€..

 

이λ₯Ό ν›„ν–‰ ν΄λ‘œμ €λ‘œ κ΅¬ν˜„ν•΄μ€€λ‹€λ©΄ 더 보기 κΉ”λ”ν•΄μ§€λŠ”λ°μš”,

 

doSomething () { () -> () in
    print("Hello!")
}

 

μ΄λ ‡κ²Œ ν›„ν–‰ ν΄λ‘œμ €λ‘œ κ΅¬ν˜„ μ‹œμ—λŠ” ν΄λ‘œμ €λ₯Ό νŒŒλΌλ―Έν„° κ°’ ν˜•μ‹μœΌλ‘œ λ³΄λ‚΄λŠ” 것이 μ•„λ‹ˆλΌ 

ν•¨μˆ˜μ˜ κ°€μž₯ λ§ˆμ§€λ§‰μ— ν΄λ‘œμ €λ₯Ό 꼬리처럼 λ§λΆ™μ—¬μ„œ μ¨μ€λ‹ˆλ‹€!

 

μ—¬κΈ°μ„œ μ€‘μš”ν•œ 것!

 

νŒŒλΌλ―Έν„°κ°€ ν΄λ‘œμ € ν•˜λ‚˜μΌ 경우,

이 ν΄λ‘œμ €λŠ” 첫 νŒŒλΌλ―Έν„°μ΄μž λ§ˆμ§€λ§‰ νŒŒλΌλ―Έν„°μ΄λ―€λ‘œ ν›„ν–‰ ν΄λ‘œμ €κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

λ˜ν•œ, "closure"λΌλŠ” Argument Label은 ν›„ν–‰ ν΄λ‘œμ €μ—μ„  μƒλž΅λ©λ‹ˆλ‹€.

 

νŒŒλΌλ―Έν„°κ°€ ν΄λ‘œμ € ν•˜λ‚˜μΌ κ²½μš°μ—λŠ”

호좜ꡬ문인 ()도 μƒλž΅ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€!!! μƒλž΅μ— μƒλž΅μ— μƒλž΅ 

 

doSomething { () -> () in
    print("Hello!")
}

 

μ—¬κΈ°μ„œ 잠깐..ν›„ν–‰ ν΄λ‘œμ €μ— λŒ€ν•΄ μ •λ¦¬ν•˜λ‹€ 머릿속에 μŠ€μ³μ§€λ‚˜κ°„ 친ꡬ....forEach..!

 

λ°˜λ³΅λ˜λŠ” μ½”λ“œλ₯Ό 쀄이기 μœ„ν•΄ ν‰μ†Œ μœ„μ™€ 같이 forEachλ₯Ό 정말 많이 μ‚¬μš©ν•˜λŠ”λ°μš”,,

forEach λ˜ν•œ ν›„ν–‰ ν΄λ‘œμ €λ‘œ κ΅¬ν˜„ν•œ κ΅¬λ¬Έμ΄μ—ˆλ‹€λŠ” 것!

μ½”λ“œλ₯Ό λœ―μ–΄λ³΄λ©΄, λ°˜λ³΅ν•˜κ³  싢은 ꡬ문을 forEachλΌλŠ” ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°λ‘œ ν΄λ‘œμ €λ‘œ μž‘μ„±ν•΄μ„œ λ„˜κ²¨μ£ΌλŠ” ν˜•νƒœμž„μ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

λ’€μ—μ„œ 더 μ •λ¦¬ν•΄λ‚˜κ°€κ² μ§€λ§Œ, νŒŒλΌλ―Έν„° ν˜•μ‹κ³Ό 리턴 ν˜•μ‹λ˜ν•œ μƒλž΅ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— 이λ₯Ό μƒλž΅ν•΄μ£Όκ³ ,

νŒŒλΌλ―Έν„°κ°€ ν΄λ‘œμ € ν•˜λ‚˜λ§Œ μ „λ‹¬λ˜λŠ” 경우이기 λ•Œλ¬Έμ— ν›„ν–‰ ν΄λ‘œμ € ν˜•μ‹μœΌλ‘œ κ΅¬ν˜„ν•œ ν›„,

forEach ν•¨μˆ˜μ˜ 호좜ꡬ문인 ()κΉŒμ§€ μƒλž΅ν•΄μ€€ ν˜•νƒœμž…λ‹ˆλ‹€! (이제 μ œλŒ€λ‘œ μ•Œκ³  μ“Έ 수 μžˆκ² λ„€μš”πŸ˜„)

2. νŒŒλΌλ―Έν„° ν˜•μ‹κ³Ό 리턴 ν˜•μ‹ μƒλž΅

forEach에 λŒ€ν•΄ μ„€λͺ…ν•˜λ‹€ 잠깐 μ–ΈκΈ‰λ˜κΈ°λ„ ν–ˆλŠ”λ°μš”, ν΄λ‘œμ €μ—μ„œ νŒŒλΌλ―Έν„° ν˜•μ‹κ³Ό 리턴 ν˜•μ‹ λ˜ν•œ μƒλž΅ κ°€λŠ₯ν•©λ‹ˆλ‹€!

 

doSomething(closure: { (a: Int, b: Int, c: Int) -> Int in
    return a + b + c
})

// μƒλž΅
doSomething(closure: { (a, b, c) in
    return a + b + c
})

 

3. 단좕 인자 이름

ν΄λ‘œμ €μ—μ„œ νŒŒλΌλ―Έν„° λ„€μž„μ„ μƒλž΅ν•˜λŠ” λ°©λ²•μœΌλ‘œ λ‹¨μΆ• 인자 이름을 μ‚¬μš©ν•©λ‹ˆλ‹€.

단좕 인자 이름은 ν΄λ‘œμ €μ˜ λ§€κ°œλ³€μˆ˜μ˜ μˆœμ„œλŒ€λ‘œ $0, $1, $2...처럼 ν‘œν˜„ν•©λ‹ˆλ‹€.

 

μ—¬κΈ°μ„œ μ€‘μš”ν•œ 점! νŒŒλΌλ―Έν„° 이름을 단좕 인자 μ΄λ¦„μœΌλ‘œ λŒ€μ²΄ν•  경우, νŒŒλΌλ―Έν„° 이름과 ν•¨κ»˜ in ν‚€μ›Œλ“œλ₯Ό μ‚­μ œν•΄μ€λ‹ˆλ‹€.

 

doSomething(closure: { (a, b, c) in
    return a + b + c
})

// 단좕 인자 이름 적용
doSomething(closure: {  
    return $0 + $1 + $2
})

 

μœ„μ—μ„œ νŒŒλΌλ―Έν„° ν˜•μ‹κ³Ό 리턴 ν˜•μ‹κΉŒμ§€ μƒλž΅ν•΄μ€€ doSomething ν•¨μˆ˜μ— 단좕 인자 이름을 μ μš©ν•œ λͺ¨μŠ΅μž…λ‹ˆλ‹€!

μ½”λ“œκ°€ 훨씬 κ°„κ²°ν•΄μ‘Œμ£ ??

4. return ν‚€μ›Œλ“œ μƒλž΅

μœ„μ—μ„œ 잠깐 μ–ΈκΈ‰λ˜μ—ˆλŠ”λ°, ν•¨μˆ˜λŠ” λ¦¬ν„΄νƒ€μž…μ΄ 없을 λ•Œλ§Œ μƒλž΅κ°€λŠ₯ν•œ 것과 λ‹€λ₯΄κ²Œ

ν΄λ‘œμ €λŠ” λ¦¬ν„΄νƒ€μž…μ΄ μžˆμ–΄λ„ μƒλž΅κ°€λŠ₯ν•˜λ‹€κ³  ν–ˆμ£ ??

이λ₯Ό μ•”μ‹œμ  λ°˜ν™˜ ν‘œν˜„μ΄λΌκ³  ν•œλ‹€κ³  μœ„μ—μ„œ 잠깐 μ„€λͺ…ν–ˆμ—ˆλŠ”λ°μš”!

 

μœ„μ˜ μ„€λͺ…을 λ‹€μ‹œ κ°€μ Έμ™€λ³΄μžλ©΄,

ν΄λ‘œμ €κ°€ λ°˜ν™˜ν•˜λŠ” 값이 μžˆλ‹€λ©΄ ν΄λ‘œμ €μ˜ λ§ˆμ§€λ§‰ μ€„μ˜ 결과값은 

return ν‚€μ›Œλ“œλ₯Ό μƒλž΅ν•˜λ”λΌλ„ μ•”μ‹œμ μœΌλ‘œ λ°˜ν™˜κ°’μœΌλ‘œ μ·¨κΈ‰ν•©λ‹ˆλ‹€.

μ£Όμ˜ν•  점은, 단일 리턴문일 μ‹œμ—λ§Œ μ μš©λœλ‹€λŠ” 것!

 

doSomething(closure: {  
    $0 + $1 + $2
})

 

μœ„μ˜ μ½”λ“œλ₯Ό λ‹€μ‹œ 가져와 μ•”μ‹œμ  λ°˜ν™˜ ν‘œν˜„μ„ μ μš©ν•΄μ€€ λͺ¨μŠ΅μž…λ‹ˆλ‹€!

νŒŒλΌλ―Έν„°λ‘œ ν΄λ‘œμ € ν•˜λ‚˜κ°€ λ„˜μ–΄μ˜€λŠ” κ²½μš°λ‹ˆκΉŒ ν›„ν–‰ ν΄λ‘œμ €λ‘œ ν‘œν˜„ν•΄λ³ΌκΉŒμš”??

 

// ν›„ν–‰ν΄λ‘œμ €λ‘œ λ°”κΎΈκ³ , 
doSomething() {  
    $0 + $1 + $2
}

// ()도 μƒλž΅ κ°€λŠ₯. μ™œλƒλ©΄ νŒŒλΌλ―Έν„° ν•˜λ‚˜μΈ 경우 ()에 아무것도 μ—†λ‹€λ©΄ μƒλž΅ κ°€λŠ₯ν•˜λ‹ˆκΉŒ
doSomething {  
     $0 + $1 + $2
}

 

μ΅œμ’…μ μœΌλ‘œ μ΄λ ‡κ²ŒκΉŒμ§€ μƒλž΅ν•΄μ„œ ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€!

 

But λ„ˆλ¬΄ μΆ•μ•½λœ μ½”λ“œλŠ” 타인이 λ³΄κ±°λ‚˜, μ‹œκ°„μ΄ μ§€λ‚œ 후에 λ³Ό λ•Œ κ°€λ…μ„±μ΄λ‚˜ λͺ…μ‹œμ„±μ΄ λ–¨μ–΄μ§ˆ 수 μžˆμœΌλ―€λ‘œ μ μ •μ„ μ—μ„œ μΆ•μ•½ν•˜λ„λ‘ ν•©μ‹œλ‹€!

 

ν΄λ‘œμ €κ°€ 무엇인지, 그리고 ν΄λ‘œμ €μ˜ νŠΉμ§•κ³Ό κ²½λŸ‰ λ¬Έλ²•κΉŒμ§€ ν΄λ‘œμ €μ˜ 기본에 λŒ€ν•΄ μ •λ¦¬ν•΄λ³΄μ•˜λŠ”λ°μš”!

λ‹€μŒ ν¬μŠ€νŒ…μœΌλ‘œ escaping closureλ₯Ό λ“€κ³  μ˜€λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€!πŸ˜ŠπŸ˜†


참고자료

https://babbab2.tistory.com/81

https://babbab2.tistory.com/82

https://suvera.tistory.com/19

https://osoomoovo.tistory.com/175