iOS/🟠 Swift

[Swift] - Capturing Values by Closures (값을 μΊ‘μ²˜ν•˜λŠ” ν΄λ‘œμ €)

woozzang 2021. 5. 7. 15:49

ν΄λ‘œμ €λŠ” μŠ€μ½”ν”„ λ°–μ˜ 값에 μ ‘κ·Όν•  λ•Œ 값을 μΊ‘μ²˜ν•©λ‹ˆλ‹€.

 

ν΄λ‘œμ €μ—λŠ” Named clousure κ³Ό Unnamed closure κ°€ μžˆμ§€λ§Œ, μ—¬κΈ°μ„œλŠ” Unnamed closure λ₯Ό κ°€λ¦¬ν‚΅λ‹ˆλ‹€.

참고둜 Named clousure 쀑 global function λŠ” 값을 μΊ‘μ²˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

값을 μΊ‘μ²˜ν•œλ‹€λŠ” μ˜λ―ΈλŠ”, κ°’μ˜ μ°Έμ‘°λ₯Ό νšλ“ν•œλ‹€λŠ” λœ»μž…λ‹ˆλ‹€.

 

λ”°λΌμ„œ 참쑰된 값을 ν΄λ‘œμ € μŠ€μ½”ν”„ λ‚΄λΆ€μ—μ„œ λ³€κ²½λ˜λ©΄, μ‹€μ œ 값도 λ³€κ²½λ©λ‹ˆλ‹€.

 

var count: Int = 0

print(count) // "0"

var closure = {

	count += 1 // μŠ€μ½”ν”„ μ™ΈλΆ€μ˜ κ°’(count)에 μ ‘κ·Όν•˜μ˜€μœΌλ―€λ‘œ, μ°Έμ‘°λ₯Ό νšλ“ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
}

print(count) // "0" :::: ν΄λ‘œμ €λ₯Ό μ„ μ–Έλ§Œ ν–ˆμ„λΏ, ν˜ΈμΆœν•˜μ§€λŠ” μ•Šμ•˜μŠ΅λ‹ˆλ‹€.


closure()
print(count) // "1" 

 

λŒ€μƒ 값이 κ°’ νƒ€μž…μΈμ§€, μ°Έμ‘° νƒ€μž…μΈμ§€λŠ” μƒκ΄€μ—†μŠ΅λ‹ˆλ‹€.

 

λ‹€λ§Œ μ°Έμ‘° νƒ€μž…μ˜ μ°Έμ‘°λ₯Ό νšλ“ν•œλ‹€λ©΄, reference count λ₯Ό μ¦κ°€μ‹œν‚€κΈ° λ•Œλ¬Έμ—, Strong Reference Cycle 이 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

κ·Έλ ‡κ²Œ 되면 ARC 에 μ˜ν•΄ λ©”λͺ¨λ¦¬μ—μ„œ μ œλŒ€λ‘œ ν• λ‹Ήν•΄μ œ (deallocated) λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.  

 

이것은 ν΄λ‘œμ € 캑처 리슀트λ₯Ό 톡해 κ΄€λ¦¬ν•΄μ•Όν•©λ‹ˆλ‹€.


 

πŸ’‘ μΆ”κ°€ μ‘μš©

class myClass {

  var handler: () -> ()
  
}

 

handler 속성을 λ‹€λ₯Έ ν΄λž˜μŠ€μ—μ„œ 전달 받은 ν΄λ‘œμ €λ‘œ μ΄ˆκΈ°ν™”ν•˜λ©΄, κ·Έ ν΄λ‘œμ € 내뢀에 캑처된 μ°Έμ‘° (λ‹€λ₯Έ 클래슀의 μ°Έμ‘°) 도 μ „λ‹¬λ°›κ²Œ λœλ‹€.

 

이 ν•¨μˆ˜μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ° κ°œλ…μ„ μ΄μš©ν•œ 핡심 아이디어λ₯Ό μ‘μš©ν•΄μ„œ reactive-programming 을 κ΅¬ν˜„ν•  수 μžˆλ‹€.

 

 

끝!


πŸ€–πŸŸ’[우짱의 iOS λΈ”λ‘œκ·Έ]πŸ”΅πŸ’»

iOSλ₯Ό κ³΅λΆ€ν•˜λ©΄μ„œ 배운 λ‚΄μš©μ„ κΈ°λ‘ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.