[Swift] if let vs guard let (응용편)

2021.07.01 - [프로그래밍/iOS] - [Swift] if let vs guard let (기본편)

 

[Swift] if let vs guard let (기본편)

안녕하세요~ 차니에요! 오늘은 if let과 guard let의 특징과 사용법 그리고 차이점에 대해 알아보겠습니다! 1. Snippets Xcode Snippets을 활용해보도록 하겠습니다. Snippets은 자동완성으로 생각하시면 편할

dvlpr-chan.tistory.com

안녕하세요~ 차니에요!

기본편을 안보고 오신 분들은 이해하는데 어려움이 있을 수 있으니 먼저 보고 오시는걸 추천드릴게요!

 

기본편에 이어서 오늘은 조금 더 심화된 내용을 알아보도록 할거에요~

지난 시간에 guard else에는 상위 코드 블럭을 종료하는 함수가 반드시 필요하다고 말씀드렸는데 이 부분을 다뤄볼게요.

 

1. continue / break

continue와 break는 반복문에서 쓸 수 있는 예약어이죠?

let channyfarm: Array<String> = ["dog", "cat", "chicken", "cow", "pig"]

차니 농장에서 동물을 찾아볼게요!

func findAnimal(kind: String) {
    for anim in channyfarm {
        guard anim == kind else {
            print("얜 아니야 ... continue \(anim)")
            continue
        }

        guard anim != kind else {
            print("찾았다!! ... break \(anim)")
            break
        }
    }
}

동물 종류를 인자로 받아서 배열을 순회하며 해당 동물을 찾는 예제입니다.

저는 농장에서 "cow"를 찾아보겠습니다.

 

guard는 조건문이 false이면 else문이 실행된다고 했었는데요.

  1. anim == kind → false 
    • 동물을 못 찾은 것이므로 continue를 호출해서 계속해서 찾도록 했습니다.
  2. anim != kind → false
    • 동물을 찾은 것이므로 break를 호출하여 찾는 것을 멈췄습니다.

이런식으로 동작이 됩니다.

2. return

func findAnimal(kind: String) {
    guard channyfarm.contains(kind) else {
        print("농장에 없는 동물이에요..")
        return
    }
    print("찾으시는 동물이 농장에 있어요!")
}

이번에도 마찬가지로 농장에서 동물을 찾아볼거에요.

findAnimal(kind: "dog")

위 코드의 실행 결과는 어떻게 될까요?

더보기
guard문의 조건이 true이므로 else에 걸리지 않습니다.

 

findAnimal(kind: "rion")

이 경우에는 어떻게 될까요?

더보기
guard 조건이 false 이므로 함수가 종료됩니다.

3. throws

이번에도 마찬가지로 농장에서 동물을 찾아볼건데 문자 그대로 throws를 통해 오류를 던져볼게요!

enum TestError: Error {
    case notFound
}

func findAnimal(kind: String) throws {
    guard channyfarm.contains(kind) else {
        throw TestError.notFound
    }
    print("찾으시는 동물이 농장에 있어요!")
}

do {
    try findAnimal(kind: "tiger")
} catch TestError.notFound {
    print("농장에 없는 동물이에요..")
}

guard문 조건을 통해 농장에 해당 동물이 없다면 TestError.notFound를 던지고 do-catch문에서 처리하는 코드입니다.

실행 결과는 당연히 2번과 동일하게 나옵니다!