Optional Binding을 아시는 분들은 if let을 한 번쯤은 보셨을 겁니다.
오늘은 Optional Binding을 사용할 때 유용한 if let과 guard let에 대해 알아보겠습니다.
guard let과 if let은 공통적으로 옵셔널 바인딩이라는 특징을 가지고 있습니다.
Optional 타입은 값이 있을 수도, 없을 수도 있는 변수를 표현할 때 사용됩니다. 하지만 안전하게 값을 사용하려면 Optional Binding을 통해 Unwrapping해야 합니다.
이럴 때 안전하게 값을 추출하기 위해 사용하는게 guard let과 if let입니다.
if let이란?
if let은 성공시와 실패 시 2가지 경우로 나눠서, 두 분기 모두에 우리가 원하는 코드를 작성해줄 수 있는데요.
값이 있을 때 특정 코드를 실행하고, 값이 없는 경우(nil)에는 다른 처리를 할 수 있습니다
하지만, if let은 지역변수로만 사용이 가능하기 때문에 구문 내에서만 사용이 가능합니다.
func printName() {
var name: String?
name = "Jud"
print(name) // Optional("Jud")
if let myName = name {
print(myName) // "Jud"
} else { // name의 값이 nil일 경우.
print("nil")
}
}
아래와 같이 name에 "Jud"가 아닌 nil을 넣게 되면, if let 구문의 안에 있는 print(myName)이 실행되지
않으며 else 구문으로 넘어가서 "nil"이 출력되게 됩니다.
func printName() {
var name: String?
name = nil
print(name) // nil
if let myName = name {
print(myName) // 실행되지 않음.
} else {
print("nil") // "nil"
}
}
또한, if let 구문에서 else는 선택적 사용이기에 꼭 사용하지 않아도 상관없습니다.
그렇다면 guard let은?
guard let은 값이 nil일 경우 else 블록이 실행되어 코드의 흐름을 제어하는 방식입니다.
else 블록 내부에서는 반드시 제어문 전환 명령어인 return, break, continue, throw 중 하나를 사용해야 하며, 이를 통해 함수 종료, 반복문 중단, 다음 반복 실행, 예외 처리 등 다양한 흐름을 관리할 수 있습니다.
또한, if let과는 달리 guard문은 항상 else 블록과 함께 사용되며, 바인딩된 변수는 이후 코드에서도 계속 활용이 가능합니다.
func printName() {
var name: String?
name = "Jud"
print(name) // Optional("Jud")
guard let myName = name else { return }
print(myName) // "Jud"
}
아래는 위의 예시와 다르게 continue문을 사용한 예시 코드입니다.
func printName() {
var name: String?
name = nil // 이름이 없음
for _ in 1...3 { // 반복문을 3번 실행
guard let myName = name else {
print("이름이 없습니다. 다음 반복으로 넘어갑니다.")
continue // 현재 반복 건너뛰고 다음 반복 실행
}
print(myName)
}
}
// 출력 :
// 이름이 없습니다. 다음 반복으로 넘어갑니다.
// 이름이 없습니다. 다음 반복으로 넘어갑니다。
// 이름이 없습니다. 다음 반복으로 넘어갑니다。
if let vs guard let
특징 | if let | guard let |
사용 목적 | 값이 있을 때만 실행 | 값이 없으면 흐름 제어 및 함수 종료 |
지역 변수 | if블록 내에서만 사용 가능 | guard 이후 코드에서도 사용 가능 |
else 필요 여부 | 선택적 사용 | 필수 (return, break 등 포함) |
if let과 guard let에 대한 설명은 여기까지입니다.
이 글을 읽으신 분들이 있다면 조금이나마 도움이 되길 바라며,
오타나 틀린 점이 있으면 지적해주시면 감사하겠습니다 :)
Reference
야곰 스위프트 프로그래밍 3판
'📌 Swift' 카테고리의 다른 글
[오늘의 Swift 지식] In-Out이란 무엇일까? (0) | 2021.08.24 |
---|---|
[오늘의 Swift 지식] 전달인자(Argument)와 매개변수(Parameter) (0) | 2021.08.13 |
[오늘의 Swift 지식] Optional Binding이란? 🧐 (0) | 2021.08.05 |
[오늘의 Swift 지식] 정렬 sort()와 sorted() (0) | 2021.07.17 |
[오늘의 Swift 지식] Optional이란? 🤔 (0) | 2021.07.11 |