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

🍎 iOS/Swift

[Swift] 클둜져(Closure) 기본

728x90

 

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


- ν΄λ‘œμ €(Closure)λž€ μ½”λ“œμ—μ„œ μ „λ‹¬λ˜κ³  μ‚¬μš©λ  수 μžˆλŠ” 자체적인(self-containedν•¨μˆ˜ 블둝

- μŠ€μœ„ν”„νŠΈμ—μ„œμ˜ ν΄λ‘œμ €λŠ” C와 Objective-Cμ—μ„œμ˜ 블둝과 μœ μ‚¬ν•˜κ³  λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œλŠ” λžŒλ‹€ν•¨μˆ˜μ™€ μœ μ‚¬

- ν΄λž˜μŠ€μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μ°Έμ‘° νƒ€μž…!! 

- ν΄λ‘œμ € ν‘œν˜„μ€ μ΅œμ ν™” λ˜μ–΄μ„œ κ°„κ²°ν•˜κ³  λͺ…ν™•, μ½”λ“œμ˜ λͺ…ν™•μ„±κ³Ό μ˜λ„λ₯Ό μžƒμ§€ μ•ŠμœΌλ©΄μ„œλ„ 문법을 μΆ•μ•½ν•΄ μ‚¬μš©ν•  수 μžˆλŠ” λ‹€μ–‘ν•œ λ¬Έλ²•μ˜ μ΅œμ ν™” 방법을 제곡

 

 


ν΄λ‘œμ €(Closure) ν•¨μˆ˜ ν˜•νƒœ (Closure Expression Syntax)

{ (λ§€κ°œλ³€μˆ˜ λͺ©λ‘) -> λ°˜ν™˜νƒ€μž… in
    μ‹€ν–‰ μ½”λ“œ
}

예문) sorted(by: )λ©”μ†Œλ“œμ™€ ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•˜μ—¬ λ°°μ—΄ μ •λ¦¬ν•˜κΈ°.

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

 


ν΄λ‘œμ €(Closure) ν•¨μˆ˜ VS μΌλ°˜ν•¨μˆ˜

 

μΌλ°˜ν•¨μˆ˜ 

  • 이름이 μžˆλ‹€.
  • func ν‚€μ›Œλ“œκ°€ μ‘΄μž¬ν•œλ‹€.
  • in ν‚€μ›Œλ“œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.
var counter = 0
func addCounter() {
  counter += 1
}
addCounter()
addCounter()

print(counter) // κ²°κ³Ό 2

 

vs

 

ν΄λ‘œμ €(Closure) ν•¨μˆ˜

  • 이름이 μ—†λ‹€.
  • func ν‚€μ›Œλ“œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • in ν‚€μ›Œλ“œκ°€ μ‘΄μž¬ν•œλ‹€. κΈ°λ³Έ ν΄λ‘œμ € λ¬Έλ²•
var counter = 0
let addCounter = {
    counter += 1
}
addCounter()
addCounter()

print(counter) // κ²°κ³Ό 2

 

 

μœ„ 두 μ½”λ“œλ₯Ό λΉ„κ΅ν•˜λ©΄, ClosureλŠ” λ³€μˆ˜μ— 값을 μ„ μ–Έν•˜λŠ” λŒ€μ‹ μ— λ³€μˆ˜μ— ν•¨μˆ˜λ₯Ό μ„ μ–Έ

μ—¬κΈ°μ„œλŠ” addCounter λ³€μˆ˜μ— ν•¨μˆ˜λ₯Ό μ„ μ–Έ

그리고 이 λ³€μˆ˜λŠ” ν•¨μˆ˜μ²˜λŸΌ ν˜ΈμΆœμ„ ν•  수 μžˆλ‹€. (addCounter() ν˜•νƒœ)

 


ν΄λ‘œμ €(Closure) μƒλž΅

μœ„μ— 예제둜 보인 sorted(by: (String, String) -> Bool)) λ©”μ†Œλ“œλ₯Ό ν™œμš©ν•˜μ—¬ ν΄λ‘œμ € μƒλž΅λ²•μ„ μ•Œμ•„λ³΄μž

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

 

1) λ°˜ν™˜, 인자 νƒ€μž… μƒλž΅

νƒ€μž…μ„ μ•Œ 수 μžˆλŠ” 경우 νƒ€μž… μƒλž΅ κ°€λŠ₯!

sorted(by: (String, String) -> Bool)) λ©”μ†Œλ“œλŠ” 이미 String νƒ€μž…μ˜ μΈμžκ°€ λ“€μ–΄μ˜€κ³ , λ°˜ν™˜ νƒ€μž…μ΄ Boolμ΄λΌλŠ” κ±Έ μ•Œ 수 μžˆμœΌλ―€λ‘œ μ•„λž˜μ™€ 같이 μƒλž΅μ΄ κ°€λŠ₯

reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )

 

2) λ°˜ν™˜ ν‚€μ›Œλ“œ μƒλž΅

단일 ν‘œν˜„ ν΄λ‘œμ €μ—μ„œλŠ” λ°˜ν™˜ ν‚€μ›Œλ“œλ₯Ό μƒλž΅ν•  수 μžˆλ‹€.

λŒ€μ‹  in ν‚€μ›Œλ“œλŠ” μƒλž΅ λΆˆκ°€!!

reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )

 

3) 인자 이름 μΆ•μ•½ (Shorthand Arguments Names)

ν΄λ‘œμ €μ˜ λ§€κ°œλ³€μˆ˜ 이름이 ꡳ이 λΆˆν•„μš”ν•˜λ‹€λ©΄ 단좕 인자 이름을 ν™œμš©ν•  수 μžˆλ‹€.

μΆ•μ•½ 인자 이름을 μ‚¬μš©ν•˜λ©΄ 인자 κ°’κ³Ό κ·Έ 인자둜 μ²˜λ¦¬ν•  λ•Œ μ‚¬μš©ν•˜λŠ” μΈμžκ°€ κ°™λ‹€λŠ” 것을 μ•ŒκΈ° λ•Œλ¬Έμ— 인자λ₯Ό μž…λ ₯λ°›λŠ” λΆ€λΆ„κ³Ό  in ν‚€μ›Œλ“œ 뢀뢄을 μƒλž΅ν•  수 μžˆλ‹€.

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

reversedNames = names.sorted(by: { $0 > $1 } )

 

4) μ—°μ‚°μž λ©”μ†Œλ“œ (Operator Methods)

λ§ˆμ§€λ§‰μœΌλ‘œ μƒλž΅ κ°€λŠ₯ν•œ λΆ€λΆ„!! 

Swiftμ—μ„œ String νƒ€μž… μ—°μ‚°μžμ—λŠ” String끼리 비ꡐ할 수 μžˆλŠ” 비ꡐ μ—°μ‚°μž(>) λ₯Ό κ΅¬ν˜„ν•΄ λ‘μ—ˆλ‹€.

이 λ•Œλ¬Έμ— κ·Έλƒ₯ 이 μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

reversedNames = names.sorted(by: >)

 

μΆ•μ•½ μ „κ³Ό ν›„ 비ꡐ 

//μΆ•μ•½ μ „
reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
    return s1 > s2
})

//μΆ•μ•½ ν›„
reversedNames = names.sorted(by: >)

 

 

 


ν΄λ‘œμ €μ˜ κ°’ 캑처(Capturing Values)

ν΄λ‘œμ €λŠ” νŠΉμ • λ¬Έλ§₯의 μƒμˆ˜λ‚˜ λ³€μˆ˜μ˜ 값을 μΊ‘μ²˜ν•  수 μžˆλ‹€.

이 λ‚΄μš©μ€ Objective-C의 λΈ”λ‘ν•¨μˆ˜μ™€ λΉ„κ΅ν•˜μ—¬ λ”°λ‘œ ν¬μŠ€νŒ… 확인!!!!!

 

↓↓↓↓↓

 

 

[Swift] ν΄λ‘œμ €(Closure) vs 블둝(Block) ν•¨μˆ˜

ν΄λ‘œμ €(Closure) vs 블둝(Block) ν•¨μˆ˜λ₯Ό λΉ„κ΅ν•΄λ³΄μž Swift의 Closure와 Objective-C의 λΈ”λ‘ν•¨μˆ˜λŠ” 이름이 μ—†λŠ” ν•¨μˆ˜λ‘œ κ°œλ…μ΄ κ°™μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ, λ‘˜μ€ κ°’을 μΊ‘μ³ν•˜λŠ” 방식에 차이가 μžˆμŠ΅λ‹ˆλ‹€. 😭 '값을 캑쳐

lxxyeon.tistory.com

 

λ°˜μ‘ν˜•