본문 바로가기

IOS

swift - 옵셔널 체이닝과 nil 병합 연산자 by yagom

728x90
반응형

옵셔널 체이닝은 옵셔널 요소 내부의 프로퍼티로 또다시 옵셔널이 연속적으로 연결되는 경우 유용하게 사용할 수 있다.

구조체 안에 구조체 또 구조체 안에 구조체가 있을때 변수가 nil인지 아닌지를 확인해야 할 경우가 생긴다.

class Person {
	var name: String
    var job: String?
    var home: Apartment? # 옵셔널(Obtional)
    
    init(name: String){
    	slef.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
    }
}

# 인스턴스 3개 만듬
let yagom: Person? = Person(name: "name")
let apart: Apartment? = Apartment(dong: "105", ho: "305")
let superman: Person? = Person(name: "superman")

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

만약 guard의 정보가 궁금하다면.. 옵셔널 체이닝을 사용하지 않은경우

# 옵셔널 체이닝을 사용하지 않는다면..
func guardJob(owner: Person?) {
	if let owner = owner {
    	if let home = owner.home{
        	if let 'guard' = home.guard{
            	if let guardJob = 'guard'.job{
                	print("Yes, job = \(guardJob)")
                } else {
                	print("None")
                }
            }
    	}
    }
}

owner의 존재 여부를 확인 하고 home의 존재 여부를 확인하고 guard의 존재 여부를 확인하고 guard.job의 존재 여부를 확인해야한다.

 

그러나 옵셔널 체이닝을 사용하면

func guardJobWithOptionalChaining(owner: Person){
	if let guardJob = owner?.home?.guard?.job{
    	print("Yes. job = \(guardJob)"
    } else {
    	print("None")
    }
}

owner?.home?.guard?.job 처럼 한번에 연결해서 작성 가능

첫 프로퍼티를 확인 후 nil이 아닌 경우 다음 프로퍼티를 확인한다. 만약 nil인 경우 다음 프로퍼티를 확인하지 않는다.

guardJobWithOptionalChaining(owner: name)
# No guard
name?.home?.guard?.job // nil, name에 home이 할당되어 있지 않으므로 nil

name?.home = apart

name?.home // Optional(Apartment) # home에 apart를 넣어주었으므로 

name?.home?.guard // nil,

name?.home?.guard = superman

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

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

name?.home?.guard?.job // nil

name?.home?.guard?.job = "GUARD"

중간에 어디 하나라도 nil값이라면 그 전에서 연산을 멈추고 nil을 반환한다.

 

// nil 병합 연산자 ??, 앞의 값이 nil이라면 그 뒤에 값에 "값"을 넣어라

var guardJob: String

guardJob = name?.home?.guard?.job ?? "Guard"
print(guardJob) // Guard

name?.home?.guard?.job = nil #job에 nil을 할당한다.

guardJob = name?.home?.guard?.job ?? "슈퍼맨"
print(guardJob) // 슈퍼맨 # job에는 nil이 할당되어 있으므로 guard의 정보가 반환됨
반응형

'IOS' 카테고리의 다른 글

swift - 오류처리 Error Handling by yagom  (0) 2023.01.10
swift - 익스텐션 extension by yagom  (0) 2023.01.10
swift - 프로토콜 by yagom  (0) 2023.01.10
swift - assert와 guard by yagom  (0) 2023.01.10
swift - 타입캐스팅 by yagom  (0) 2023.01.10