iOS/🟠 Swift

Optional Unwrapping - Optionals

woozzang 2020. 10. 9. 12:27

Optional Unwrapping

"μ˜΅μ…”λ„μΈ 값을 μ˜΅μ…”λ„μ΄ μ•„λ‹Œ κ°’μœΌλ‘œ μΆ”μΆœν•˜λŠ” 것"

 

nil 이 μ•„λ‹Œ μ˜΅μ…”λ„ 값은 포μž₯λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

 

값을 μ‚¬μš©ν•˜λ €λ©΄ κΊΌλ‚΄μ•Ό ν•©λ‹ˆλ‹€.

 

이것을 Unwrapping 이라 ν•©λ‹ˆλ‹€. ' 값을 μΆ”μΆœν•œλ‹€ ' 라고 ν‘œν˜„ν•˜κΈ°λ„ ν•©λ‹ˆλ‹€.

 

 

μΆ”μΆœμ—λŠ” 3κ°€μ§€ 방법이 μžˆμœΌλ‚˜, 1κ°€μ§€ λ°©λ²•λ§Œ μ‚¬μš©ν•˜κ³  λ‚˜λ¨Έμ§€λŠ” μ§€μ–‘ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

κ·Έ 방법이 λ°”λ‘œ Optional Binding  μž…λ‹ˆλ‹€.


 

Optional Binding

" μŠ€μœ„ν”„νŠΈκ°€ μ œκ³΅ν•˜λŠ” μ•ˆμ „ν•˜κ³  μ„Έλ ¨λœ nil 체크 방법 "

 

μš°λ¦¬λŠ” nil 이 μ•„λ‹Œ μ˜΅μ…”λ„ 값을 μΆ”μΆœν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

μΆ”μΆœ ν›„ 접근을 ν–ˆλŠ”λ° 값이 nil 이라면, λŸ°νƒ€μž„ μ—λŸ¬κ°€ λ°œμƒν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

 

Optional Binding 은 λ‹¨μˆœνžˆ μ˜΅μ…”λ„ 값이 nil 인지 μ•„λ‹Œμ§€ 확인 ν›„ 값을 μ‚¬μš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

그것은 기쑴의 λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ null 체크λ₯Ό ν™•μΈν•˜λŠ” 방법과 λ‹€λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

 

기쑴의 방식:

if optionalVal != nil {

	// nil 이 μ•„λ‹ˆλ©΄ μΆ”μΆœν•˜λŠ” μ½”λ“œ

}

 

Optional Binding 을 μ΄μš©ν•œ 방식:

if var realVal = optionalVal {
	
    // nil 이 μ•„λ‹Œ κ²½μš°μ—λ§Œ if 블둝에 μ§„μž…ν•˜κ²Œ λ©λ‹ˆλ‹€.
    // λ˜ν•œ realVal 은 if 블둝 λ‚΄μ—μ„œλ§Œ μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€.
    
} else {

    // realVal μ‚¬μš© λΆˆκ°€
    
}

 

 λ˜ν•œ realVal 을 μƒμˆ˜λ‘œ μ‚¬μš©ν•˜λ €λ©΄ let 으둜 μ„ μ–Έν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€.

 

그리고 λ§Œμ•½ realVal 을 블둝 μ΄ν›„μ—μ„œλ„ μ‚¬μš©ν•˜κ³  μ‹Άλ‹€λ©΄, guard 문을 μ‚¬μš©ν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€.

 

guard let realVal = optionalVal else {

    // optionalVal 이 nil 이라면 Binding μ‹€νŒ¨
    
    // Binding μ‹€νŒ¨ μ‹œ, else λΈ”λŸ­μ— μ§„μž…ν•©λ‹ˆλ‹€. 그리고 Early Exit.

}

realVal = someVal // μ—λŸ¬. μ΄λ²ˆμ—λŠ” realVal 을 μƒμˆ˜λ‘œ μ„ μ–Έν–ˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

let newVal = realVal // guard 문을 μ‚¬μš©ν•˜λ©΄ 블둝 μ΄ν›„μ—μ„œλ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

이 μ™Έμ˜ Uwrapping 방법

μ‚¬μš©μ„ μ§€μ–‘ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— κ°„λ‹¨ν•˜κ²Œλ§Œ μ •λ¦¬ν•˜λ €κ³  ν•©λ‹ˆλ‹€.

 

' ! ' λ₯Ό μ‚¬μš©ν•˜λŠ” κ°•μ œ μΆ”μΆœ(Forced Unwrapping) κ³Ό μ•”μ‹œμ  μΆ”μΆœ μ˜΅μ…”λ„ (Implicitly Unwrapped Optionals) 이 μžˆμŠ΅λ‹ˆλ‹€.

 

1. Forced Unwrapping

κ°•μ œ μΆ”μΆœμ€ μ˜΅μ…”λ„ νƒ€μž…μ— ' ! ' λ₯Ό λΆ™μ—¬μ£Όμ–΄ nil 체크λ₯Ό ν•˜μ§€ μ•Šκ³  μΆ”μΆœν•©λ‹ˆλ‹€.

λ”°λΌμ„œ κ°•μ œ μΆ”μΆœν•œ 값이 nil 일 경우 λŸ°νƒ€μž„ μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€.

 

2. Imlicitly Unwrapped Optionals

μ•”μ‹œμ  μΆ”μΆœ μ˜΅μ…”λ„μ€ ν˜•μ„ μ–Έμ— ' ? '  λŒ€μ‹  ' ! ' κ°€ λΆ™μŠ΅λ‹ˆλ‹€.

이 νƒ€μž…μ—λŠ” nil을 ν• λ‹Ήν•  수 있고, νŠΉμ • 쑰건 μ—μ„œ μ‚¬μš© μ‹œ  λ”°λ‘œ μΆ”μΆœμ΄ ν•„μš” μ—†λ‹€λŠ” 점이 νŠΉμ§•μž…λ‹ˆλ‹€. 즉, λ‹€λ₯Έ νƒ€μž…μ²˜λŸΌ κ·Έλƒ₯ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ‚¬μš© μ‹œ 100%의 ν™•μ‹ μœΌλ‘œ nil 이 아닐 것이라고 생각될 λ•Œ μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€.

 

" When you access an implicitly unwrapped optional, the system assumes it has a valid value and automatically unwraps it for you. Note that this causes the app to terminate if the variable’s value has not yet been set. "

 

μœ„μ—μ„œ μ–ΈκΈ‰ν•œ νŠΉμ • 쑰건 μ΄λž€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

let num: Int! = 12

let a = num         //a : Int?

let b: Int = num    //b : Int

//type annotation 된 경우만 μžλ™μœΌλ‘œ Unwrapping λœλ‹€.

 

 

 

끝!