옵셔널 체이닝 -TIL36

future0159 2월 4일 PM 06:42 6 1
future0159 Profile Image Level 9
1

옵셔널 체이닝

구조체나 클래스를 선언해줄때, 구조체 안에 또다른 구조체 인스턴스가 들어올수있고, 구조체 인스턴스 안에 또다른 인스턴스가 오는것과 같이 프로퍼티를 타고 계속 들어가야하는 경우가 발생하고 이때 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("우리집 경비원은 직업이 없습니당.")
                }
            }
        }
    }
}

만약 초기화될때 필요한 프로퍼티들만 초기화되어있는 상태이고 옵셔널 체이닝을 만약 사용하지 않는다면,if let을 4번정도 확인하게 된다. 하지만 체이닝을 사용하게 되면 한줄로 표현하는것이 가능해지기 떄문에 이런식으로 연쇄작용을 통해 가져오는 옵셔널 체이닝 방식이 존재한다.

guardJobWithOptionalChaining(owner: Person?){
    if let guardJob = owner?.home?.guard?.job{
        print("우리 경비원의 직업은 \(guardJob) 입니다.")
    } else {
        print("경비원 직업이 없습니다.")
    }
}

이런식으로 한단계 한단계 가는것이 가능해짐.이런식으로 경비원값을 job에다가 할당해주면 chaining방식을 통해서 꺼내오는 것이 가능하다.

var guardJob: String
guardJob = yudon?.home?.guard?.job ?? "슈퍼맨" // print superman

만약 이때, nil값으로 할당하는 것을 원하지 않는다면, 병합 연산자를 통해서 프로퍼티 값이 nil이라면 ?? 연산자의 오른쪽 위치에 해당하는 값을 할당한다. job이 위에서 할당해줬기 때문에, 경비원 값이 된다. nil을 할당해줬을떈 job값이 없기 때문에 superman이 할당된다.



댓글