if let과 guard let

if let과 guard let
Photo by Evi T. / Unsplash

안녕하세요 Noah입니다 :)

날이 아주 덥습니다 여러분~! ⛱☀️

건강 유의하셔서 즐코딩하세요 ㅎㅎ🍉

오늘은 if문을 이용한 Optional Binding
guard문을 이용한 Optional Binding에 대해 알아보도록 하겠습니다.

Optional type의 값을 안전하게 가져오기 위해서는 Optional Binding을 해주어야 합니다.

먼저 if문을 사용해 Optional Binding을 하는 방법을 보도록 하겠습니다.

if문을 이용한 Optional Binding


let optionalName: String? = "Noah"

if let name = optionalName {
    print(name)
}

print(name) // compile error

상수 name에 값을 담기 위해 먼저 optionalName의 값을 평가합니다.

만약 optionalName에 값이 존재한다면(nil이 아니라면)

상수 nameoptionalName에 담긴 값인 Optional("Noah")가 언래핑되어

"Noah"name 상수에 대입되고 true가 return 됩니다.

optionalName에 값이 존재하지 않는다면(nil이라면) false가 return 되어

if문 이후로 제어가 전달됩니다.

마지막 줄에서 name의 값을 읽어오려 하는데, compile error가 발생합니다.

error 메시지는 다음과 같습니다.

Cannot find 'name' in scope

1

if문을 사용해 Optional Binding을 진행한 상수 혹은 변수는 if문 내부에서만 사용 가능합니다.

다시 말해 if문의 내부 scope에서만 사용이 가능합니다.

다음으로 guard문을 사용해 Optional Binding을 하는 방법을 살펴보도록 하겠습니다.

guard문을 이용한 Optional Binding


let optionalName: String? = "Noah"

func unwrapName() {
    guard let name = optionalName else {
        print("optional binding 실패")
        return
    }
    print(name)
}

unwrapName()

다른 프로그래밍 언어를 보다 Swiftguard문을 보면 생소할 수 있습니다. (제가 그랬습니다 ㅎㅎ)

guard문early exit이라는 특성이 있습니다.

early exit이란?

원하는 조건을 만족하지 않으면 이후의 코드를 실행하지 않고 종료를 시켜버림을 의미합니다.

guard문의 조건을 만족하지 않는다면 guard문이 선언된 해당 Scope벗어나
같은 Scope의 이후 코드를 실행하지 않습니다.

따라서 guard문else block은 절대 생략할 수 없으며,
else block에는 해당 Scope를 벗어나기 위한 return, continue, break, throw등의 구문이 반드시 포함되어야 합니다.

위와 같은 특성 때문에 guard문함수나 메소드와 같이 local scope를 갖는 곳에서 사용합니다.

2

guard문으로 Optional Binding한 값은

guard문이 선언된 scope 내부 임과 동시에, guard문이 실행된 이후의 scope 내에서 사용이 가능합니다.

또한 guard문else block에서는 Optional Binding한 값을 사용할 수 없습니다.

else block으로 제어가 넘어왔을 때는 Optional Binding에 실패했기 때문입니다☝️

Summary


if문을 이용한 Optional Binding은 성공적으로 상수에 nil이 아닌 값을 전달했다면

해당 값을 if문 내부에서 local 상수로 사용합니다.

만약 상수에 nil을 전달했다면 if문 이후로 제어가 전달되어 if문 이후의 code를 진행할 수 있습니다.

guard문을 이용한 Optional Binding은 성공적으로 상수에 nil이 아닌 값을 전달했다면

guard문이 선언된 scope임과 동시에 guard문
실행된 이후의 scope 내에서 해당 상수를 사용할 수 있습니다.

만약 상수에 nil을 전달했다면 무조건 해당 scope를 벗어납니다.

따라서 둘의 차이를 구분하여 상황에 맞는 Optional Binding을 이용해 Optional type의 값의 unwrapping을 진행하면 될 것 같습니다.

또한 binding한 값을 변경해야 한다면 let 키워드를 var 키워드로 교체해주시면 됩니다😄

여기까지 if문을 이용한 Optional Binding
guard문을 이용한 Optional Binding에 대해 알아보았습니다.

혹시 제가 잘못 알고 있는 부분이 있거나, 오타 혹은 궁금한 점 있으시면 댓글로 알려주시면 감사하겠습니다!!😎

참고
- docs.swift.org