guard
Swift 2.0에서 새로운 guard
문이 추가되었다. 이는 특정 조건을 만족하지 않을 때 지정한 블럭을 수행하는 것이며, 따라서 필연적으로 else 를 써야 한다. 기본적인 문법은 다음과 같다.
guard x > 0 else { return }
이 문법은 사실 본질적으로
if !(x > 0) {
return
} else {
...
}
와 동일하다. 물론 return 으로 귀결된다는 점에서 아래와 같이 쓰는 게 더 간편하다.
if !(x > 0) { return }
즉 guard 문의 일차적인 기능은 필수조건을 충족하지 못하는 경우에 현재 문맥을 미리 빠져나가도록 하는 것이고 이는 if !... {return}
을 쓰는 것보다 나은 것이 없어 보일 수 있다. 근데 if 문에서 옵셔널 값을 언래핑하는 걸 생각해보자.
if let x = someOptional where x > 0 {
...
} else {
return
}
if let ...
문에서 언래핑한 옵셔널 값은 if 문의 블럭 내에서만 유효하므로 위와 같은 식으로 써야 한다. 그리고 if 블럭 내에서 계속해서 옵셔널 값이 등장해서 이를 언래핑해야 한다면, 계속해서 nested 레벨이 늘어나게 된다.
하지만 guard let ... else
문의 경우에는 블럭 이후에도 언래핑하여 바인딩한 값이 유지된다.
guard let x = someOptional where x > 0 else { return }
... // Use x as a local constant
덕분에 옵셔널값을 다뤄야 할 때 nested 레벨을 대폭 줄일 수 있다.