λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
⌨️ Language/swift

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

by hyebin (Helia) 2023. 2. 6.
λ°˜μ‘ν˜•

ν΄λ‘œμ € (Closure)

  • μ‚¬μš©μžμ˜ μ½”λ“œ μ•ˆμ—μ„œ μ „λ‹¬λ˜μ–΄ μ‚¬μš©ν•  수 μžˆλŠ” λ‘œμ§μ„ κ°€μ§„ μ€‘κ΄„ν˜Έ"{}" κ΅¬λΆ„λœ μ½”λ“œμ˜ 블둝
  • 이름이 μ—†λŠ” ν•¨μˆ˜
  • ν΄λ‘œμ €λŠ” μ–΄λ– ν•œ μƒμˆ˜λ‚˜ λ³€μˆ˜μ˜ μ°Έμ‘°λ₯Ό 캑처(capture)ν•΄μ„œ μ €μž₯ κ°€λŠ₯
  • SwiftλŠ” 이 μΊ‘μ²˜μ™€ κ΄€λ ¨ν•œ λͺ¨λ“  λ©”λͺ¨λ¦¬λ₯Ό μ•Œμ•„μ„œ 처리
  • νŒŒλΌλ―Έν„°λ₯Ό 받을 수 있고, λ°˜ν™˜ 값이 μ‘΄μž¬ν•  수 μžˆλ‹€λŠ” μ μ—μ„œ ν•¨μˆ˜μ™€ 동일
  • Swift ν΄λ‘œμ €λŠ” μ΅œμ ν™”λ₯Ό 톡해 κΉ”λ”ν•˜κ³  λͺ…ν™•ν•œ μŠ€νƒ€μΌμ„ κ°€μ§€κ³  있음
    • λ¬Έλ§₯(context)μ—μ„œ 인자 νƒ€μž…κ³Ό λ°˜ν™˜ νƒ€μž…μ˜ μΆ”λ‘  
    • 단일 ν‘œν˜„μ‹ ν΄λ‘œμ €μ˜ μ•”μ‹œμ  λ°˜ν™˜ 
    • μΆ•μ•½λœ 인자 이름 
    • ν›„μœ„ ν΄λ‘œμ € 문법
{ (λ§€κ°œλ³€μˆ˜ 이름 : λ§€κ°œλ³€μˆ˜ νƒ€μž…) -> λ°˜ν™˜νƒ€μž… in 
	ν΄λ‘œμ € ν‘œν˜„μ‹ μ½”λ“œ
}

 

ν›„ν–‰ ν΄λ‘œμ € (trailing closure) 

  • ν΄λ‘œμ €κ°€ ν•¨μˆ˜μ˜ λ§ˆμ§€λ§‰ argument라면, λ§ˆμ§€λ§‰ λ§€κ°œλ³€μˆ˜ 이름을 μƒλž΅ν•œ ν›„ ν•¨μˆ˜ μ†Œκ΄„ν˜Έ 외뢀에 ν΄λ‘œμ €λ₯Ό κ΅¬ν˜„ν•  수 있게 ν•΄μ£ΌλŠ” 것
//ν›„ν–‰ ν΄λ‘œμ € λ―Έμ‚¬μš©
let onAction = UIAlertAction(title: "On", style: UIAlertAction.Style.default, handler: {
    //μ‹€ν–‰ μ½”λ“œ
})

//ν›„ν–‰ ν΄λ‘œμ € μ‚¬μš©
let onAction = UIAlertAction(title: "On", style: UIAlertAction.Style.default) {
    //μ‹€ν–‰ μ½”λ“œ
})

 

ν΄λ‘œμ € μΆ•μ•½ ν‘œν˜„

  • νƒ€μž… μƒλž΅
    • ν΄λ‘œμ €λŠ” λ©”μ„œλ“œμ—μ„œ μš”κ΅¬ν•˜λŠ” ν˜•νƒœλ‘œ 전달해야 함
    • κ·Έλž˜μ„œ μŠ€μœ„ν”„νŠΈμ—μ„œλŠ” μ΄λŸ¬ν•œ λ¬Έλ§₯을 μ΄μš©ν•΄ νƒ€μž…μ„ μœ μΆ”ν•  수 있음
    • κ·Έλž˜μ„œ λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ΄λ‚˜ λ°˜ν™˜ νƒ€μž…μ„ μƒλž΅ν•΄μ„œ ν΄λ‘œμ €λ₯Ό μ‚¬μš© κ°€λŠ₯
  • return μƒλž΅
  • λ§€κ°œλ³€μˆ˜ μƒλž΅
    • λ§€κ°œλ³€μˆ˜μ˜ 이름을 λͺ…μ‹œν•˜μ§€ μ•Šμ•„λ„ $와 숫자의 μ‘°ν•©μœΌλ‘œ 단좕 인자 이름을 μ‚¬μš© κ°€λŠ₯
    • $0이 첫 번째 λ§€κ°œλ³€μˆ˜κ°€ 되고 $1λŠ” 두 번째 λ§€κ°œλ³€μˆ˜
    • 'in' ν‚€μ›Œλ“œλ„ μƒλž΅
  • μ—°μ‚°μžλ§Œ ν‘œκΈ°
    • ν΄λ‘œμ €λŠ” λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…κ³Ό λ°˜ν™˜ νƒ€μž…μ΄ μ—°μ‚°μžλ₯Ό κ΅¬ν˜„ν•œ ν•¨μˆ˜μ˜ λͺ¨μ–‘κ³Ό λ™μΌν•˜λ‹€λ©΄, μ—°μ‚°μžλ§Œ ν‘œκΈ°ν•˜λ”λΌλ„ μ•Œμ•„μ„œ μ—°μ‚°ν•˜κ³  λ°˜ν™˜
let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

let reversed = names.sorted(by: { (s1: String, s2: String) -> Bool in
    return s1 > s2
})

//νƒ€μž… μƒλž΅
let reversed = names.sorted(by: { (s1, s2) in
    return s1 > s2
})

//return μƒλž΅
let reversed = names.sorted(by: { (s1, s2) in
   	s1 > s2
})

//λ§€κ°œλ³€μˆ˜ μƒλž΅
let reversed = names.sorted(by: {
    return $0 > $1
})

//μ—°μ‚°μžλ§Œ ν‘œκΈ°
let reversed = names.sorted(by: >)

 

λ°˜μ‘ν˜•