23.光学スクリーニングとnilのマージ


1.光学調整(Optional Chaining)

  • ファイバフィルタは、ファイバ内部に接続するときに便利です.
  • 毎回
  • はnilをチェックしないで、最終的に必要な値があるかどうかをチェックします.
  • // 예제 클래스
    // 사람 클래스
    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 yagom: Person? = Person(name: "yagom")
    let apart: Apartment? = Apartment(dong: "101", ho: "202")
    let superman: Person? = Person(name: "superman")
    
    // 옵셔널 체이닝이 실행 후 결과값이 nil일 수 있으므로
    // 결과 타입도 옵셔널입니다
    
    // 만약 우리집의 경비원의 직업이 궁금하다면..?
    
    // 옵셔널 체이닝을 사용하지 않는다면...
    func guardJob(owner: Person?) {
        if let owner = owner {
            if let home = owner.home {
                if let `guard` = home.guard {
                    if let guardJob = `guard`.job {
                        print("우리집 경비원의 직업은 \(guardJob)입니다")
                    } else {
                        print("우리집 경비원은 직업이 없어요")
                    }
                }
            }
        }
    }
    guardJob(owner: yagom)
    
    // 옵셔널 체이닝을 사용한다면
    func guardJobWithOptionalChaining(owner: Person?) {
        if let guardJob = owner?.home?.guard?.job {
            print("우리집 경비원의 직업은 \(guardJob)입니다")
        } else {
            print("우리집 경비원은 직업이 없어요")
        }
    }
    guardJobWithOptionalChaining(owner: yagom)
    // 우리집 경비원은 직업이 없어요
    
    
    yagom?.home?.guard?.job // nil
    
    // 집 할당
    yagom?.home = apart
    
    yagom?.home // Optional(Apartment)
    
    yagom?.home?.guard // nil
    
    // 경비원 할당
    yagom?.home?.guard = superman
    
    yagom?.home?.guard // Optional(Person)
    
    yagom?.home?.guard?.name // superman
    yagom?.home?.guard?.job // nil
    
    // 직업 할당
    yagom?.home?.guard?.job = "경비원"
    

    2.nil連結演算子(nil-連結演算子)

  • 中尉演算子です.?
  • Optional ?? Value
  • オフセット値がnilの場合、右側の値が返されます.
  • スペースに注意してください.
  • var guardJob: String
        
    guardJob = yagom?.home?.guard?.job ?? "슈퍼맨"
    print(guardJob) // 경비원
    
    yagom?.home?.guard?.job = nil
    
    guardJob = yagom?.home?.guard?.job ?? "슈퍼맨"
    print(guardJob) // 슈퍼맨