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

[Swift] μ˜΅μ…”λ„ (Optional)

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

μ˜΅μ…”λ„(Optional)

  • 값이 μžˆμ„ μˆ˜λ„ 있고 없을 μˆ˜λ„ μžˆλŠ” λ³€μˆ˜
  • 값이 μ—†λŠ” 경우λ₯Ό λ‚˜νƒ€λ‚Ό λ•Œμ—λŠ” nil을 μ‚¬μš©
  • λ³€μˆ˜ μ •μ˜ν•  λ•Œ νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜μ— λ¬ΌμŒν‘œ(?)λ₯Ό λΆ™μ—¬ μ •μ˜
  • Optional(value) ν˜•νƒœλ‘œ 좜λ ₯
  • μ˜΅μ…”λ„μ— μ΄ˆκΉƒκ°’μ„ μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ 기본값은 nil
var name: String?
print(name) //nil

name = "hyebin"
print(name) //Optional("hyebin")
  • μ˜΅μ…”λ„λ‘œ μ •μ˜ν•œ λ³€μˆ˜λŠ” μ˜΅μ…”λ„μ΄ μ•„λ‹Œ λ³€μˆ˜μ™€λŠ” 닀름
var optional_name: String? = "hyebin"
let name: String = optional_name

 

Value of optional type 'String?' must be unwrapped to a value of type 'String'

name λ³€μˆ˜λŠ” μ˜΅μ…”λ„μ΄ μ•„λ‹Œ String이기 λ•Œλ¬Έμ— 항상 값이 μžˆμ–΄μ•Ό 함

optional_name은 μ˜΅μ…”λ„λ‘œ μ„ μ–Έλœ λ³€μˆ˜μ΄κΈ° λ•Œλ¬Έμ—, μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° μ „κΉŒμ§€λŠ” κ°’μ˜ 유무λ₯Ό μ•Œ 수 μ—†μŒ

Swift μ»΄νŒŒμΌλŸ¬λŠ” μ•ˆμ „μ„ μœ„ν•΄ μ˜΅μ…”λ„μ΄ μ•„λ‹Œ λ³€μˆ˜μ— μ˜΅μ…”λ„λ‘œ μ„ μ–Έλœ λ³€μˆ˜λ₯Ό λŒ€μž…ν•  수 μ—†κ²Œ λ§Œλ“¦

 

μ˜΅μ…”λ„ 바인딩 (Optional Binding)

  • μ˜΅μ…”λ„μ˜ 값을 κ°€μ Έμ˜€κΈ° μœ„ν•΄ μ˜΅μ…”λ„μ„ λ²—κ²¨λ‚΄λŠ” ν–‰μœ„
  • μ˜΅μ…”λ„μ˜ 값이 μ‘΄μž¬ν•˜λŠ”μ§€λ₯Ό κ²€μ‚¬ν•œ λ’€, μ‘΄μž¬ν•œλ‹€λ©΄ κ·Έ 값을 λ‹€λ₯Έ λ³€μˆ˜μ— λŒ€μž…
  • if let λ˜λŠ” if var μ‚¬μš©
  • μ˜΅μ…”λ„μ˜ 값을 λ²—κ²¨μ„œ 값이 μžˆλ‹€λ©΄ ifλ¬Έ μ•ˆμœΌλ‘œ λ“€μ–΄κ°€κ³ , nil이라면 κ·Έλƒ₯ 톡과
if let name = optional_name{
    print(name)  //optional_name의 값이 μ‘΄μž¬ν•œλ‹€λ©΄ ν•΄λ‹Ή κ°’ 좜λ ₯
}
//optional_name의 값이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ ifλ¬Έ μ§€λ‚˜μΉ¨
  • ν•˜λ‚˜μ˜ ifλ¬Έμ—μ„œ μ—¬λŸ¬ μ˜΅μ…”λ„ 바인딩 κ°€λŠ₯
if let name = optional_name, let email = optional_email{
    print(name, email)
}

 

μ˜΅μ…”λ„ 체이닝 (Optional Chaining)

  • 연속적인 μ˜΅μ…”λ„λ“€μ„ μ—°μ‡„μ μœΌλ‘œ 확인
  • μ˜΅μ…”λ„μ˜ 속성에 μ ‘κ·Όν•  λ•Œ, μ˜΅μ…”λ„ 바인딩 과정을 λ¬ΌμŒν‘œ(?) ν‚€μ›Œλ“œλ‘œ μ€„μ—¬μ£ΌλŠ” μ—­ν• 
//μ˜΅μ…”λ„ 바인딩
let array: [String]? = []
var isEmptyArray = false

if let array = array, array.isEmpty {
  isEmptyArray = true
} else {
  isEmptyArray = false
}

//μ˜΅μ…”λ„ 체이닝
let isEmptyArray = array?.isEmpty == true

 

κ°•μ œ μ–Έλž˜ν•‘ (Force Unwrapping)

  • μ˜΅μ…”λ„μ— 값이 μžˆλ‹€κ³  κ°€μ •ν•˜κ³  값에 λ°”λ‘œ μ ‘κ·Ό
  • μ˜΅μ…”λ„ νƒ€μž…μ˜ λ³€μˆ˜ 이름 뒀에 λŠλ‚Œν‘œ(!)λ₯Ό λΆ™μ—¬ μ‚¬μš©
  • λ§Œμ•½ μ˜΅μ…”λ„ 값이 nil인 경우 λŸ°νƒ€μž„μ—λŸ¬ λ°œμƒ
print(optional_name!)
fatal error: unexpectedly found nil while unwrapping an Optional value

 

nil 병합 μ—°μ‚°μž (nil coalescing operator)

  • "??"λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•œ μ€„λ‘œ μ–Έλž˜ν•‘ μˆ˜ν–‰
  • μ–Έλž˜ν•‘ν•˜κ³ μž ν•˜λŠ” μ˜΅μ…”λ„ λ³€μˆ˜ ?? nil일 λ•Œ λŒ€μ‹ ν•  κ°’
let name = optional_name ?? "abc"

print(name)

optional_name에 값이 μžˆλ‹€λ©΄ optional_name의 값이 좜λ ₯되고, μ—†λ‹€λ©΄ abcκ°€ 좜λ ₯

 

μ•”μ‚¬μ μœΌλ‘œ 벗겨진 μ˜΅μ…”λ„ (Implicitly Unwrapped Optional)

  • μ˜΅μ…”λ„μ΄μ§€λ§Œ μ–Έλž˜ν•‘ν•˜μ§€ μ•Šκ³ λ„ μ‚¬μš©ν•  수 μžˆλŠ” μ˜΅μ…”λ„
  • μ˜΅μ…”λ„μ„ μ •μ˜ν•  λ•Œ, λ¬ΌμŒν‘œ(?) λŒ€μ‹  λŠλ‚Œν‘œ(!)λ₯Ό μ‚¬μš©
  • nil을 포함할 수 μžˆλŠ” μ˜΅μ…”λ„
  • μ ‘κ·Όν•  λ•Œ μ˜΅μ…”λ„ λ°”μΈλ”©μ΄λ‚˜ μ˜΅μ…”λ„μ„ λ²—κΈ°λŠ” 과정을 κ±°μΉ˜μ§€ μ•Šκ³ λ„ λ°”λ‘œ 값에 μ ‘κ·Όν•  수 μžˆλ‹€λŠ” μ μ—μ„œ 일반적인 μ˜΅μ…”λ„κ³Ό 닀름
  • 값이 μ—†λŠ”λ° 접근을 μ‹œλ„ν•˜λŠ” 경우 λŸ°νƒ€μž„ μ—λŸ¬ λ°œμƒ

 

λ°˜μ‘ν˜•