옵셔널 체이닝이란 옵셔널 타입의 프로퍼티, 메서드, 서브스크립션 등을 가져오거나 호출할 때 사용할 수 있는 일련의 과정입니다. 옵셔널에 값이 있다면 프로퍼티, 메서드, 서브스크립션 등을 호출할 수 있지만, 옵셔널이 nil이라면 프로퍼티, 메서드, 서브스크립션 등은 nil을 반환합니다.
let optionalChaining: Int? = someInstance.address?.room?.phoneNumber
위 코드에서 물음표가 붙은 것은 옵셔널 값이라는 것이고 저 chaining 과정에서 nil이 하나라도 존재한다면 nil을 반환한다는 의미입니다.
중간에 물음표를 느낌표로 바꿀 수도 있습니다. 하지만 강제 추출을 시도하는 것이기 때문에 만약 해당 내용이 nil이었다면 런타임 오류가 발생합니다.
서브스크립트에서도 사용할 수 있는데 주로 사용되는 곳은 옵셔널 컬렉션 타입입니다. 옵셔널 서브스크립트를 사용하고자할 때는 대괄호보다 앞에 물음표를 표기해주어야 합니다.
let optionalArray: [Int]? = [1, 2, 3]
optionalArray?[1]
빠른 종료의 핵심 키워드는 guard입니다.
guard 뒤에 따라오는 Bool 값이 false라면 else의 코드 블록을 실행하게 되는데, 이때 else 구문의 블록 내부에는 꼭 자신보다 상위의 코드 블록을 종료하는 코드가 들어가게 됩니다. 어떤 조건이 맞지 않으면 코드 블록의 실행을 종료할 수 있습니다.
코드 블록을 종료할 때는 return , break, continue, throw 등의 제어문 전환 명령을 사용하거나 fatalError()와 같은 비반환 함수나 메서드를 호출할 수 있습니다.
guard 구문을 사용하면 if 코드를 훨씬 간결하고 읽기 좋게 구성할 수 있습니다.
for i in 0...3 {
if i == 2 {
print(i)
} else {
continue
}
}
for i in 0...3 {
guard i == 2 else {
continue
}
print(i)
}
guard 구문은 옵셔널 바인딩의 역할도 할 수 있습니다.
let optionalArray: [Int]? = [1, 2, 3]
func getNum() {
guard let num = optionalArray?[2] else { return }
print(num)
}
guard 구문에서는 추가 조건을 쉼표로 나열해줄 수 있습니다. 쉼표는 &&와 같은 논리연산입니다.
func getNum() {
guard let num = optionalArray?[2],
let nextNum = optionalArray?[1] else { return }
print("\(num), \(nextNum)")
}
자료 출처: 야곰 스위프트 프로그래밍 3판
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."