ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Optional Unwrapping - Optionals
    iOS/🟠 Swift 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 λœλ‹€.

     

     

     

    끝!


     

    'iOS > 🟠 Swift' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

    Type Inference - Data Types  (0) 2020.11.03
    3 features of First Class Citizen - Function  (0) 2020.11.02
    Tuples - Tuples  (0) 2020.10.25
    Swift) Raw Value - Enumeration  (0) 2020.10.24
    Optionals - Optionals  (0) 2020.10.09

    λŒ“κΈ€

μ–΄μ œλ³΄λ‹€ λ°œμ „ν•œ λ‚˜