Skip to content

Latest commit

Β 

History

History
154 lines (120 loc) Β· 4.47 KB

Optional.md

File metadata and controls

154 lines (120 loc) Β· 4.47 KB

μ˜΅μ…”λ„ μ΄λž€ 무엇인지 μ„€λͺ…ν•˜μ‹œμ˜€

Answer

Optional(μ˜΅μ…”λ„): 값이 μžˆμ„ μˆ˜λ„ 있고 없을 μˆ˜λ„ μžˆλŠ” 것

let optionalConstant: Int? = nil // possible
let someConstant: Int = nil // error

πŸ“Œ Definition

enum Optional<Wrapped> : ExpressibleByNilLiteral {
		case none  //값이 μ—†λŠ” 것
		case some(Wrapped) //값이 μžˆλŠ” 것 λ‘˜ λ‹€ ν‘œν˜„ κ°€λŠ₯
}

// λ‘˜ λ‹€ μ‚¬μš© κ°€λŠ₯
let optionalValue: Optional<Int> = nil
let optionalValue: Int? = nil

πŸ“Œ μ˜΅μ…”λ„μ„ μ‚¬μš©ν•˜λŠ” 이유

  • λͺ…μ‹œμ  ν‘œν˜„

    1. nil의 κ°€λŠ₯성을 μ½”λ“œλ§ŒμœΌλ‘œ ν‘œν˜„ κ°€λŠ₯
    2. λ¬Έμ„œ/주석 μž‘μ„± μ‹œκ°„ μ ˆμ•½
  • μ•ˆμ „ν•œ μ‚¬μš©

    1. 전달받은 값이 μ˜΅μ…”λ„μ΄ μ•„λ‹ˆλΌλ©΄ nil 체크λ₯Ό ν•˜μ§€ μ•Šκ³  μ‚¬μš© κ°€λŠ₯
    2. μ˜ˆμ™Έ 상황을 μ΅œμ†Œν™” ν•˜λŠ” μ•ˆμ „ν•˜κ³  효율적인 μ½”λ”©

πŸ“Œ μ˜΅μ…”λ„ ν‘œν˜„

  • !(Implicitly Unwrapped Optional)

    • μž„μ‹œμ  μΆ”μΆœ μ˜΅μ…”λ„
    • κΈ°μ‘΄ λ³€μˆ˜μ²˜λŸΌ μ‚¬μš© κ°€λŠ₯
  • ?(General Optional)

    • κΈ°μ‘΄ λ³€μˆ˜μ²˜λŸΌ μ‚¬μš© λΆˆκ°€ - μ˜΅μ…”λ„κ³Ό 일반 값을 λ‹€λ₯Έ νƒ€μž…μ΄λ―€λ‘œ μ—°μ‚° λΆˆκ°€

πŸ“Œ μ˜΅μ…”λ„ 바인딩(Optional Binding)

  • if-let
    • nil 체크 & μ•ˆμ „ν•œ κ°’ μΆ”μΆœ
    var myName: String? = "wonseok"
    var yourName: String? = nil
    
    if let name = myName, let friend = yourName {
            print("\(name) and \(friend)")
    }
    // yourName이 nil이기 λ•Œλ¬Έμ— μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€
    
    yourName = "sujeong"
    if let name = myName, let friend = yourName {
            print("\(name) and \(friend)")
    }
    // wonseok and sujeong
  • Force Unwrapping(κ°•μ œμΆ”μΆœ)
    • nil 체크 없이 κ°•μ œλ‘œ 값을 κΊΌλ‚΄λŠ” 방식, 값이 없을 경우 λŸ°νƒ€μž„ 였λ₯˜κ°€ λ°œμƒν•˜μ—¬ 앱이 λ©ˆμΆ”κΈ° λ•Œλ¬Έμ— μΆ”μ²œλ˜μ§€ μ•ŠλŠ” 방식
    var myName: String? = nil
    print(myName!) // error 값이 μ—†μ–΄μ„œ λŸ°νƒ€μž„ 였λ₯˜

πŸ“Œ μ˜΅μ…”λ„ 체이닝(Optional Chaining)

  • μ˜΅μ…”λ„ 체이닝

    // μ‚¬λžŒ 클래슀
    class Person {
        var name: String
        var job: String?
        var home: Apartment?
        
        init(name: String) {
            self.name = name
        }
    }
    // μ‚¬λžŒμ΄ μ‚¬λŠ” 집 클래슀
    class Apartment {
        var buildingNumber: String
        var roomNumber: String
        var `guard`: Person?
        var owner: Person?
        
        init(dong: String, ho: String) {
            buildingNumber = dong
            roomNumber = ho
        }
    }
    
    let wonseok: Person? = Person(name: "wonseok")
    let apart: Apartment? = Apartment(dong: "101", ho: "202")

    이런 μ½”λ“œκ°€ μžˆμ„ λ•Œ Person A의 Apartment의 경비원 직업이 κΆκΈˆν•˜λ‹€λ©΄?

    // μ˜΅μ…”λ„ 체이닝을 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ μ΄λ ‡κ²Œ 됨
    func guardJob(owner: Person?) {
            if let owner = owner { // 1.μ‚¬λžŒμ˜ 쑴재 μ—¬λΆ€
                    if let home = owner.home { // 2.κ·Έ μ‚¬λžŒμ˜ 집 μ—¬λΆ€
                            if let 'guard' = home.guard { // 3.κ·Έ μ‚¬λžŒμ˜ μ§‘μ˜ 경비원 μ—¬λΆ€
                                    if let guardJob = 'guard'.job { // 4.κ·Έ μ‚¬λžŒμ˜ μ§‘μ˜ κ²½λΉ„μ›μ˜ 직업 μ—¬λΆ€
                                                print("μš°λ¦¬μ§‘ κ²½λΉ„μ›μ˜ 직업은 \(guardJob)μž…λ‹ˆλ‹€")
                                    } else {
                                                print("μš°λ¦¬μ§‘ 경비원은 직업이 μ—†μ–΄μš”")
                                    }
                            }
                    }
                }
        }
    // μ˜΅μ…”λ„ 체이닝을 μ‚¬μš©ν•œλ‹€λ©΄
    func guardJobwithOptionalChaining(owner: Person?) {
                    if let guardJob = owner?.home?.guard?.job {
                                    print("μš°λ¦¬μ§‘ κ²½λΉ„μ›μ˜ 직업은 \(guardJob)μž…λ‹ˆλ‹€")
                    } else {
                                                print("μš°λ¦¬μ§‘ 경비원은 직업이 μ—†μ–΄μš”")
                    }
    }
    
    guardJobwithOptionalChaining(owner: wonseok)
    // μš°λ¦¬μ§‘ 경비원은 직업이 μ—†μ–΄μš”
  • nil 병합 μ—°μ‚°μž

    • OptionalΒ ??Β Value
    • μ˜΅μ…”λ„ 값이 nil일 경우, 우츑의 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
    var house: String
    
    house = wonseok?.home?.owner?.name ?? "본인"
    // -> '??' μ•žμ˜ 값이 nil이라면 "본인"을 할당해달라!
    print(house) // 본인 // μœ„μ—μ„œ '본인'을 λ„£μ–΄μ€˜μ„œ nil이 μ•„λ‹˜