옵셔널 바인딩은 if-else문으로도 가능하지만, guard문으로도 가능하다.
다음은 guard문의 특성이다.
- if-else문은 if 부분만 따로 사용해도 되지만, guard문은 else와 한쌍이다. 둘은 항상 같이 사용해야한다. guard 뒤에 else가 붙지 않으면 컴파일러가 지적한다.
- guard문 뒤의 else문 안에서는 항상 함수를 종료시켜야한다. 만약 else문 내부에서 함수를 종료시키지 않으면 이 또한 컴파일러가 지적한다.
- guard문에서 옵셔널 바인딩을 통해 초기화된 옵셔널의 값은 옵셔널이 아닌 일반 타입의 값으로 해당 함수의 스코프 내 어디에서든 사용이 가능해진다.
이러한 guard문의 특성을 이용해 함수 내부의 옵셔널에 값이 들어있지 않을 때는 함수를 일찍 종료하고 나머지 코드를 실행을 하지 않게 할 수 있다.
func downloadImage (from url: URL?) {
guard let url = url else {
print("url is nil. url not found!")
return
}
print("url is not wrapped with optional here: \(url)"
beginDownload(url: url)
}
- guard를 이용한 옵셔널 바인딩 역시 한번에 여러개를 처리할 수도 있고, 다른 조건문과 함께 섞어서 사용할 수도 있다. guard문은 옵셔널 바인딩에만 한정된 것이 아니라 일반적인 조건문과도 사용이 가능하다.
옵셔널에 대한 7가지 개념
- force unwrapping ✅
- optional binding - if ✅
- optional binding - guard ✅
- nil coalescing
- optional chaining
- implicitly unwrapped optional
- optional pattern