study record

[Swift] 옵셔널 체이닝과 빠른 종료 본문

Swift/스위프트 프로그래밍

[Swift] 옵셔널 체이닝과 빠른 종료

asong 2021. 12. 2. 16:59

옵셔널 체이닝

옵셔널 체이닝은 옵셔널에 속해있는 nil일지도 모르는 프로퍼티, 메서드, 서브스크립션 등을 가져오거나 호출할 때 사용할 수 있는 일련의 과정이다. 옵셔널을 반복 사용하여 옵셔널이 자전거 체인처럼 서로 꼬리를 물고 있는 모양이기 때문에 옵셔널 체이닝이라고 부른다. 중첩된 옵셔널 중 하나라도 값이 존재하지 않는다면 결과적으로 nil을 반환한다.

옵셔널 체이닝은 프로퍼티나 메서드, 서브스크립트를 호출하고 싶은 옵셔널 변수나 상수 뒤에 물음표를 붙여 표현한다. 옵셔널이 nil이 아니라면 정상적으로 호출될 것이고, nil이라면 nil을 반환할 것이다.

 

let yagom: Person = Person(name: "yagom")

if let roomNumber: Int = yagom.address?.building?.room?.number {
	print(roomNumber)
} else {
	print("Can not find room number")
}

 

빠른 종료

빠른 종료의 핵심 키워드는 guard이다. guard구문은 if 구문과 유사하게 Bool 타입의 값으로 동작하는 기능이다. guard 뒤에 따라붙는 코드의 실행 결과가 true 일 때 코드가 계속 실행된다. if 구문과 다르게 guard 구문은 항상 else 구문이 뒤에 따라와야 한다. 만약 guard 뒤에 따라오른 값이 false 라면 else 블록 내부 코드를 실행하게 되는데, 이 때 자신보다 상위의 코드 블록을 종료하는 코드가 들어가게 된다. 특정 조건에 부합하지 않다는 판단이 되면 재빠르게 코드 블록의 실행을 종료할 수 있다.

 

guard 구문을 사용하면 if 코드를 훨씬 간결하고 읽기 좋게 구성할 수 있다. 예외사항만을 처리하고 싶다면 guard 구문을 사용하는 것이 훨씬 간편하다.

 

// if 구문을 사용한 코드
for i in 0...3 {
	if i == 2 {
		print(i)
	} else {
	continue
}}

// guard 구문을 사용한 코드
for i in 0...3 {
	guard i == 2 else {
		continue
	}
	print(i)
}

 

조금 더 구체적인 조건을 추가하고 싶다면 쉼표(,)로 추가 조건을 나열해주면 된다. 추가 조건은 Bool 타입이어야 한다. 쉼표를 &&으로 치환해도 같은 결과를 얻을 수 있다.

 

func enterClub(name: String?, age: Int?) {
	guard let name: String = name, let age: Int = age, age > 19, 
					name.isEmpty == false else {
					print("You are too young to enter the club")
					return
			}

		print("Welcome \(name)!")
}

 

 

 

guard 구문의 한계는 자신을 감싸는 코드 블록의 제어문 전환 명령어를 쓸 수 없는 상황이라면 사용이 불가능하다는 점이다. 함수나 메서드 등 특정 블록 내부에 위치하지 않는다면 사용이 제한된다.