if let과 guard let
안녕하세요 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이 아니라면)
상수 name
에 optionalName
에 담긴 값인 Optional("Noah")
가 언래핑되어
"Noah"
가 name
상수에 대입되고 true가 return 됩니다.
optionalName
에 값이 존재하지 않는다면(nil이라면) false
가 return 되어
if문 이후로 제어가 전달됩니다.
마지막 줄에서 name의 값을 읽어오려 하는데, compile error
가 발생합니다.
error
메시지는 다음과 같습니다.
Cannot find 'name' in scope
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()
다른 프로그래밍 언어를 보다 Swift의 guard문을 보면 생소할 수 있습니다. (제가 그랬습니다 ㅎㅎ)
guard문은 early exit이라는 특성이 있습니다.
early exit이란?
원하는 조건을 만족하지 않으면 이후의 코드를 실행하지 않고 종료를 시켜버림을 의미합니다.
guard문의 조건을 만족하지 않는다면 guard문이 선언된 해당 Scope를 벗어나
같은 Scope의 이후 코드를 실행하지 않습니다.
따라서 guard문의 else block은 절대 생략할 수 없으며,
else block에는 해당 Scope를 벗어나기 위한 return
, continue
, break
, throw
등의 구문이 반드시 포함되어야 합니다.
위와 같은 특성 때문에 guard문은 함수나 메소드와 같이 local scope를 갖는 곳에서 사용합니다.
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