if
문과 반대로 조건이 false
일 때 실행되는 코드guard condition else {
// false: execute some code
}
// true: execute some code
else
를 통해 조건이 맞지 않는 상태를 먼저 걸러내고, 하단에 핵심 코드가 진행되도록 함수를 디자인하는데 유용하다.func divide(_ number: Double, by divisor: Double) {
// 나누는 수가 0인 경우를 먼저 걸러낸다.
guard divisor != 0.0 else {
return
}
// 핵심 로직
let result = number / divisor
print(result)
}
if
vsguard
if
문을 사용해 비슷한 디자인을 구현할 수 있다.func divide(_ number: Double, by divisor: Double) { if divisor == 0.0 { return } let result = number / divisor print(result) }
- 하지만, 함수의 조건을 명확하게 보여주는 것은
guard
이다.// 나누는 수가 0이 되면 안된다는 것을 명확하게 보여줌 guard divisor != 0.0 else { return }
if
문을 사용하는 것(pyramid of doom)보다 함수의 조건을 파악하고 내부 코드를 한눈에 보기 유용하다.func singHappyBirthday() {
guard birthdayIsToday else {
print(”No one has a birthday today.”)
return
}
guard !invitedGuests.isEmpty else {
print(”It’s just a family party.”)
return
}
guard cakeCandlesLit else {
print(”The cake’s candles haven’t been lit.”)
return
}
print(”Happy Birthday to you!”)
}
pyramid of doom
if
문 내부에if
문이 계속 반복되는 코드func singHappyBirthday() { if birthdayIsToday { if !invitedGuests.isEmpty { if cakeCandlesLit { print(”Happy Birthday to you!”) } else { print(”The cake’s candles haven’t been lit.”) } } else { print(”It’s just a family party.”) } } else { print(”No one has a birthday today.”) } }
if-let
과 유사하게 optional에서 값 추출이 가능하다.
추출할 값이 nil
일 경우에는 else
문이 실행된다.
if-let
과 달리, 외부에서 해당 constant로의 접근이 가능하다.
// if-let
if let eggs = goose.eggs {
print(”The goose laid \(eggs.count) eggs.”)
}
// 이곳에선 `eggs`에 접근할 수 없음
// guard let
guard let eggs = goose.eggs else { return }
// `eggs`에 접근 가능
print(”The goose laid \(eggs.count) eggs.”)
if let
과 동일하게 한번에 여러개의 optional의 값을 추출할 수 있다.// if let
func processBook(title: String?, price: Double?, pages: Int?) {
if let theTitle = title,
let thePrice = price,
let thePages = pages {
print(”\(theTitle) costs $\(thePrice) and has \(thePages)
pages.”)
}
}
// guard let
func processBook(title: String?, price: Double?, pages: Int?) {
guard let theTitle = title,
let thePrice = price,
let thePages = pages else {
return
}
print(”\(theTitle) costs $\(thePrice) and has \(thePages) pages.”)
}