[Swift 야곰] 2단원. 옵셔널 체이닝과 nil 병합

Jamong·2023년 1월 17일
0

Day 11 - 2023.01.17

옵셔널 체이닝

  • 옵셔널 체이닝은 옵셔널의 내부의 내부로 옵셔널이 연결되어 있을 때 유용하게 활용 할 수 있다.
  • 매번 nil 확인을 하지 않고 최종적으로 원하는 값이 있는지 없는지 확인할 수 있다.
ex.swift

class Person {
	var name: String
    var job: String?
    var home: Apartment?
    
    // 초기화(Initalization)
    inint(name: String) {
    	self.name = name
    }
}

class Apartment {
	var buildingNumber: String
    var rommNumber: String
    var `guard`: Person?
    var owner: Person?
    
    // 초기화(Initalization)
    init(dong: String, ho: String) {
    	buildingNumber = dong
        roomNumber = ho
    }
}


// 옵셔널 체이닝 사용
let jamong: Person? = Person(name: "jamong")
let aprat: Apratment? = Apartment(dong: "101", ho: "202")
let superman: Person? = Person(name: "superman")


// 옵셔널 체이닝이 실행 후 결과값이 nil일 수 있으므로 결과 타입도 옵셔널이다.

// ex) 우리집의 경비원의 직업이 궁금할 때 옵셔널 체이닝을 사용하지 않는다면
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("우리집 경비원은 직업이 없어요")
                }
            }
        }
    }
}

guardJobWithOptionalChaining(owner: jamong) // 출력 : 우리집 경비원은 직업이 없어요.


jamong?.home?.guard?.job 	// nil

jaomg?.home = apart

// 집 할당
jamong?.home 			// Optional(Apartment)

jamong?.home?.guard		// nil


// 경비원 할당
jamong?.home?.guard = superman

jamong?.home?.guard		// Optional(Person)

jamong?.home?.guard?.name	// superman

jamong?.home?.guard?.job	// nil

// 직업 할당
jamong?.home?.guard?.job = "경비원"

nil 병합 연산자

  • 중위 연산자 ??
  • Optional ?? Value
  • 옵셔널 값이 nil일 경우, 우측의 값이 반환한다.
  • 띄어쓰기에 주의한다.
var guardJob: String

// guardJob이 jamong?.home?.guard?.job이 없으면 "슈퍼맨" 할당
guardJob = jamong?.home?.guard?.job ?? "슈펴맨"

print(guardJob)		// 출력 : 경비원

jamong?.home?.guard?.job = nil

guardJob = jamong?.home?.guard?.job ?? "슈펴맨"

print(guardJob)		// 출력 : 슈퍼맨
profile
새해 목표 : 1일 1 깃, 블로그, 프로그래머스 2문제

0개의 댓글