Swift

[ Swift ] μ˜΅μ…”λ„ Optionals

Forest Yun 2021. 9. 5. 21:49
728x90

κ³΅λΆ€ν•œ λ‚΄μš©μ„ μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€.

 

 

 

 

μ˜΅μ…”λ„ Optionals

  1. μ˜΅μ…”λ„μ΄λž€?
  2. μ˜΅μ…”λ„ μΆ”μΆœ
  3. μŠ€μœ„ν”„νŠΈμ˜ λͺ©ν‘œμ— λ§žλŠ” μ˜΅μ…”λ„ μ‚¬μš©

 

 

 

 

 

 

 

 

 

 


1. μ˜΅μ…”λ„μ΄λž€?

 

μ˜΅μ…”λ„ Optionals

: 선택 사항. 값이 μžˆμ„ μˆ˜λ„, 없을 μˆ˜λ„ μžˆλ‹€. 즉, λ³€μˆ˜ λ˜λŠ” μƒμˆ˜μ˜ 값이 nil(NULL)일 μˆ˜λ„ μžˆλ‹€.

  • μŠ€μœ„ν”„νŠΈμ˜ 언어적 νŠΉμ§• 쀑 ν•˜λ‚˜μΈ 'Safe- μ•ˆμ „ν•œ ν”„λ‘œκ·Έλž˜λ° 지ν–₯'을 λ³΄μ¦ν•˜λŠ” κΈ°λŠ₯이닀.
  • μŠ€μœ„ν”„νŠΈλŠ” μ—„κ²©ν•œ 문법을 가지고 μžˆλŠ”λ°, λ”°λΌμ„œ μ˜΅μ…”λ„ 여뢀에 따라 λ‘˜μ„ λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ κ΅¬λΆ„ν•œλ‹€. (컴파일 였λ₯˜)
  • λ°μ΄ν„°νƒ€μž…? λ˜λŠ” Optional<λ°μ΄ν„°νƒ€μž…>
  • μ˜΅μ…”λ„ μ£Ό μ‚¬μš© λͺ©μ 
    • nil 값을 λŒ€μž…ν•΄μ•Ό ν•  λ•Œ
    • μ΄ˆκΉƒκ°’μ΄ μ—†μ–΄ μ–΄λ–€ 값이 λ“€μ–΄κ°ˆμ§€ λͺ¨λ₯Ό λ•Œ
    • μ „λ‹¬μΈμžμ˜ 값이 잘λͺ»λœ 값일 경우 μ œλŒ€λ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν–ˆμŒμ„ nil둜 ν‘œν˜„ν•  수 μžˆλ‹€.
    • λ§€κ°œλ³€μˆ˜ λΆˆν•„μš” 의미둜 λ§€κ°œλ³€μˆ˜ νƒ€μž…μ„ μ˜΅μ…”λ„λ‘œ μ •μ˜ν•  수 μžˆλ‹€.

 

 

 

μ˜΅μ…”λ„ κΈ°λ³Έ μ‚¬μš©

var introduce: String? = "Hi! I am yh!"
print(introduce)
//좜λ ₯ Optional("Hi! I am yh!")

introduce = nil
print(introduce)
//좜λ ₯ nil

 

 

 

 

 

  • μ˜΅μ…”λ„μ€ μ—΄κ±°ν˜•μœΌλ‘œ κ΅¬ν˜„λ˜μ–΄ μžˆλ‹€.
    • case none : nil일 λ•Œ, 즉 값이 μ—†λŠ” 경우.
    • case some(Wrapped) : 값이 μžˆλŠ” 경우. 값이 있으면 some의 연관값인 Wrapped에 값이 ν• λ‹Ήλœλ‹€.
    • μ˜΅μ…”λ„ μžμ²΄κ°€ μ—΄κ±°ν˜•μ΄κΈ° λ•Œλ¬Έμ— μ˜΅μ…”λ„ λ³€μˆ˜λŠ” switch ꡬ문을 톡해 κ°’ 유무λ₯Ό 확인할 수 μžˆλ‹€.
    • switch ꡬ문 μ‚¬μš©λ³΄λ‹€λŠ” μ˜΅μ…”λ„ μΆ”μΆœμ„ μ‚¬μš©ν•˜λŠ” 편이 더 μ•ˆμ „ν•˜κ³  νŽΈλ¦¬ν•˜λ‹€

 

μ˜΅μ…”λ„ μ—΄κ±°ν˜•μ˜ μ •μ˜

 public enum Optional<Wrapped> : ExpressibleByNilLiteral {
    case none
    case some(Wrapped)
 
    public init(_ some: Wrapped)
    ...
 }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


2. μ˜΅μ…”λ„ μΆ”μΆœ

  • Optional Unwrapping
  • μ˜΅μ…”λ„μ˜ 값을 μ˜΅μ…”λ„μ΄ μ•„λ‹Œ κ°’μœΌλ‘œ μΆ”μΆœ
  • μ˜΅μ…”λ„λ‘œ μ„ μ–Έλœ λ³€μˆ˜μ— 값이 ν• λ‹Ήλ˜λ©΄ κ·Έ 값은 'μ˜΅μ…”λ„μ— λž˜ν•‘(wrapped)λ˜μ—ˆλ‹€.'κ³  ν•˜λ©° μ–Έλž˜ν•‘(unwrapping)ν•΄μ•Ό  κ°’에 μ ‘κ·Όν•  수 μžˆλ‹€.

 

 

 

 


 

 

 

 

 

2.1 μ˜΅μ…”λ„ κ°•μ œ μΆ”μΆœ (κ°•μ œ μ–Έλž˜ν•‘) Forced Unwapping

  • κ°’!
  • μ˜΅μ…”λ„μ˜ 값을 μΆ”μΆœν•˜λŠ” κ°€μž₯ κ°„λ‹¨ν•œ 방법, But μ˜΅μ…”λ„μ˜ λͺ©μ (Safe)을 μƒμ‹€ν•˜λŠ” μœ„ν—˜ν•œ 방법(λŸ°νƒ€μž„ 였λ₯˜ λ°œμƒ κ°€λŠ₯μ„± λ†’μŒ)
  • κ°•μ œ μΆ”μΆœ μ‹œ μ˜΅μ…”λ„μ˜ 값이 nil이라면 λŸ°νƒ€μž„ 였λ₯˜ λ°œμƒ
let number1: Int? = 2
let number2: Int = number1!

print(number1) //μ˜΅μ…”λ„
print(number2) //μ˜΅μ…”λ„μ˜ 값을 μΆ”μΆœν•œ κ°’

//좜λ ₯
//Optional(2)
//2

 

 

 

 


 

 

 

 

 

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

  • μ˜΅μ…”λ„μ˜ κ°’ 유무 확인 μ‹œ μ‚¬μš©ν•œλ‹€.
  • μ˜΅μ…”λ„μ˜ 값이 nil이 아닐 μ‹œ, μ˜΅μ…”λ„μ• μ„œ μΆ”μΆœ(μ–Έλž˜ν•‘)ν•œ 값을 일정 블둝 μ•ˆμ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” μƒμˆ˜λ‚˜ λ³€μˆ˜λ‘œ ν• λ‹Ήν•΄μ„œ μ˜΅μ…”λ„μ΄ μ•„λ‹Œ ν˜•νƒœλ‘œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•΄μ€€λ‹€.
  • μ•ˆμ „ν•˜κ³  μ„Έλ ¨λœ 방법
  • if λ˜λŠ” while ꡬ문 λ“±κ³Ό ν•¨κ»˜ μ‚¬μš©ν•œλ‹€.
  • μ˜΅μ…”λ„ 바인딩을 톡해 ν•œ λ²ˆμ— μ—¬λŸ¬ μ˜΅μ…”λ„ 값을 μΆ”μΆœ(μ–Έλž˜ν•‘)ν•  수 μžˆλ‹€. (AND 쑰건-ν•˜λ‚˜λΌλ„ nil이면 false)

 

var myTitle: String? = "7μ›” 여름 νœ΄κ°€"
var myContent: String? = "여름 νœ΄κ°€λ‘œ μ œμ£Όλ„μ— λ†€λŸ¬κ°€κΈ°λ‘œ ν–ˆλ‹€."

if let title = myTitle, var content = myContent {
    //λ³€μˆ˜μ΄λ―€λ‘œ λ‚΄λΆ€μ—μ„œ 변경이 κ°€λŠ₯ν•˜λ‹€.
    content = title + "\n" + content
    print(content)
} else {
    print("nil")
}

/*
 좜λ ₯
 7μ›” 여름 νœ΄κ°€
 여름 νœ΄κ°€λ‘œ μ œμ£Όλ„μ— λ†€λŸ¬κ°€κΈ°λ‘œ ν–ˆλ‹€.
 */

 

 

 

 


 

 

 

 

 

 

 

2.3 μ•”μ‹œμ  μΆ”μΆœ μ˜΅μ…”λ„ (암묡적 μ–Έλž˜ν•‘) Implicitly Unwrapped Optionals

  • λ°μ΄ν„°νƒ€μž…!
  • κ°•μ œ μ–Έλž˜ν•‘μ„ μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ 값에 μ ‘κ·Όν•  수 μžˆλ‹€.
  • nil을 ν• λ‹Ήν•  수 μžˆμ–΄μ•Ό ν•˜κ³ , λ‘œμ§μƒ nil λ•Œλ¬Έμ— λŸ°νƒ€μž„ 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•Šμ„ 것 κ°™λ‹€λŠ” 확신이 λ“€ λ•Œ μ‚¬μš©
  • μ•”μ‹œμ  μΆ”μΆœ μ˜΅μ…”λ„λ‘œ μ§€μ •λœ νƒ€μž…μ€ 일반 κ°’μ²˜λŸΌ μ‚¬μš©ν•  수 μžˆμ§€λ§Œ μ—¬μ „νžˆ μ˜΅μ…”λ„μ΄κΈ°μ— nil도 ν• λ‹Ήν•  수 μžˆλ‹€.
  • μ•”μ‹œμ  μΆ”μΆœ μ˜΅μ…”λ„λ„ μ˜΅μ…”λ„μ΄κΈ°λ•Œλ¬Έμ— μ˜΅μ…”λ„ 바인딩을 μ‚¬μš©ν•  수 μžˆλ‹€.
let str1: String! = "yh"
print(str1)
//Optional("yh")

let str2: String = str1
print(str2)
//yh

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


3. μŠ€μœ„ν”„νŠΈμ˜ λͺ©ν‘œμ— λ§žλŠ” μ˜΅μ…”λ„ μ‚¬μš©

μŠ€μœ„ν”„νŠΈλŠ” Safe, 즉 μ•ˆμ „ν•œ ν”„λ‘œκ·Έλž˜λ°μ„ λͺ©ν‘œλ‘œ ν•˜κ³  μžˆλ‹€. 그리고 μ˜΅μ…”λ„μ€ 이에 맞게 μ•ˆμ •μ„±μ„ λ³΄μ¦ν•˜κΈ° μœ„ν•œ κΈ°λŠ₯을 가지고 μžˆλ‹€. λ”°λΌμ„œ μ˜΅μ…”λ„μ„ μ‚¬μš©ν•  λ•Œ, λŸ°νƒ€μž„ 였λ₯˜κ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” 'μ˜΅μ…”λ„ κ°•μ œ μΆ”μΆœ', 'μ•”μ‹œμ  μΆ”μΆœ μ˜΅μ…”λ„' μ‚¬μš©μ„ 지양해야 ν•œλ‹€. 그리고 μ˜΅μ…”λ„ 바인딩, nil 병합연산, μ˜΅μ…”λ„ 체이닝 λ“±μ˜ 방법을 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

 

 

 

μŠ€μœ„ν”„νŠΈ λͺ©ν‘œ

https://88yhtserof.tistory.com/17?category=966954 

 

[ SWIFT ] μŠ€μœ„ν”„νŠΈλž€?

κ³΅λΆ€ν•œ λ‚΄μš©μ„ μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€. Chapter 1. μŠ€μœ„ν”„νŠΈ 1. μŠ€μœ„ν”„νŠΈλž€? ARC (Automatic Reference Counting μžλ™ μ°Έμ‘° 횟수 계산) 지원 -λ©”λͺ¨λ¦¬ 관리 쉬움 컴파일 μ–Έμ–΄ ν”„λ‘œκ·Έλž¨μ„ λΉŒλ“œ, μ‹€ν–‰ν•˜λŠ” κ³Όμ • λΆˆν•„μš”.

88yhtserof.tistory.com

 

nil λ³‘ν•©μ—°μ‚°μž

https://88yhtserof.tistory.com/27?category=966954 

 

[ SWIFT ] μ—°μ‚°μž - μ‚°μˆ  μ—°μ‚°μž, 비ꡐ μ—°μ‚°μž, μ‚Όν•­ 쑰건 μ—°μ‚°μž, λ²”μœ„ μ—°μ‚°μž, nil 병합 μ—°μ‚°μž, λΆ€

κ³΅λΆ€ν•œ λ‚΄μš©μ„ μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€. μ—°μ‚°μž μ‚°μˆ  μ—°μ‚°μž 비ꡐ μ—°μ‚°μž μ‚Όν•­ 쑰건 μ—°μ‚°μž λ²”μœ„ μ—°μ‚°μž nil 병합 μ—°μ‚°μž λΆ€ν˜Έ λ³€κ²½ μ—°μ‚°μž λ“€μ–΄κ°€κΈ° μ „, μŠ€μœ„ν”„νŠΈλŠ” 띄어쓰기도 μ€‘μš”ν•œ 문법 μœΌλ‘œ, μ—°μ‚°

88yhtserof.tistory.com

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

곡뢀 자료

μ•Όκ³° - μŠ€μœ„ν”„νŠΈ ν”„λ‘œκ·Έλž˜λ° 5판 (SWIFT5)
Do It! μŠ€μœ„ν”„νŠΈλ‘œ 아이폰 μ•± λ§Œλ“€κΈ° κ°œμ • 5판

 

728x90