guard let vs if let

이원희·2020년 11월 27일
1

 🐧 Swift

목록 보기
3/32
post-thumbnail

Swift로 개발하다보면 정말 자주 마주치고, 자주 쓰는 구문이 아닐까 싶다.
이전에는 그냥 느낌 가는대로 썼었는데 guard let 구문을 쓴 이유에 대해 리뷰를 받았었다.
이번 기회에 guard let과 if let에 대해서 정리해두고 명확한 기준을 세우고 싶어서 포스팅한다.
(리뷰 받은지 좀 된건 안 비밀...)

guard let과 if let 뭐가 다른데?


뭐가 다른지 알아보기 전에 코드를 봐보자.
swift는 optional을 지원한다.

optional은 값이 있을 수도 nil일수도 있다.

(자세한건 여기서 확인해보자.)
guard let과 if let은 옵셔널 바인딩에 사용할 수 있다.

useNormal(_:)

위의 코드에서 useNormal(_:)은 옵셔널 바인딩하지 않고 입력받은 name을 그대로 출력한다.
출력 결과를 확인해보면 Optional("wonhee")라고 출력된다.

지금은 코드로만 봐서 그럴수도 있지라고 생각할 수 있다.
실제 서비스에서 Optional 값을 바인딩하지 않고 label이나 button에 출력한다고 생각해보자.
label에 사용자의 이름 wonhee가 나와야하는데 Optional("wonhee")라고 출력되게 된다.

useGuard(_:)

위의 코드에서 useGuard(_:)는 guard let으로 옵셔널 바인딩해 입력받은 name을 출력한다.

guard let 구문의 특징을 살펴보자.

guard 구문은 항상 else 구문이 따라와야한다.
guard 구문 뒤에 따라오는 Bool 값이 false라면 else 구문이 실행된다.

위의 코드로 보자면 만약 입력 받은 name이 nil이라면 else 구문의 return이 실행된다.
즉, name이 nil이라면 useGuard(_:) method를 탈출한다.

else 블록 내부 코드에는 종료하는 코드가 반드시 들어가야 한다.
return, break, continue, throw제어문 전환 명령을 사용한다.

guard let은 아래의 코드처럼 ,(쉼표)로 조건을 추가할 수 있다.

func useGuard(_ name: String?, _ age: Int?) {
	guard let myName = name,
    	      let myAge = age else {
        	return
    	}
        print(myName + " " + myAge)
}

나는 옵셔널 바인딩으로만 예시를 들었지만 아래와 같이 결과값이 Bool 값이면 다 가능하다.

func useGuard(_ name: String?) {
	let flag = false
    guard let myName = name, flag {
    	return
    }
    print(myName)
}

guard 구문으로 바인딩된 상수 (위의 경우에는 myName, myAge)들은 guard 구문 아래부터 함수 내부의 지역상수처럼 사용 가능하다.

useIf(_:)

위의 코드에서 useIf(_:)는 if let으로 옵셔널 바인딩해 입력받은 name을 출력한다.

guard let과 다른 점을 살펴보자.

  • if letguard let과 다르게 if 구문으로 바인딩된 상수 (위의 경우에는 myName)은 if 구문 내에서만 사용 가능하다.
  • else 구문이 반드시 따라와야하는 guard와는 달리 else 구문이 선택 사항이다.
  • guard 구문은 조건이 false라면 아래의 구문을 실행하지 않는다.

마무리

guard let과 if let에 대해서 알아봤다.
둘이 공통점도 있지만 차이점도 명확한거 같다.
두 구문을 사용할때에는 차이점을 생각하면서 어떤 구문을 쓰면될지 정하면 될거 같다.
예외상황을 처리해야할때는 guard let을 사용하는 것을 우선 기준으로 잡으려고 한다.

그럼 오늘도 이만!👋

0개의 댓글