오늘은 swift에서 guard let 이용한 Optional unwrapping 방법을 알아보겠습니다.
1. guard let
1-1. guard let
guard let은 옵셔널 값이 nil이 아닌지 확인하고,
nil이 아니라면 옵셔널을 언래핑하는 방법입니다.
if let과 달리, guard let은 언래핑된 값을 함수나 블록의 나머지 부분에서 사용할 수 있게 해줍니다.
guard let 사용시,
nil일 경우에 대한 else 블록을 반드시 구현해야 하고요.
이 블록안에서,
return, break, continue, throw 등으로,
현재 스코프를 벗어나는 코드도 같이 작성해 주어야 합니다.
guard let unwrappedValue = optionalValue else {
// optionalValue가 nil일 경우 실행되는 코드
return
}
// 여기서부터 optional이 아닌 값으로 사용 가능
실제 사용코드를 보면 다음과 같습니다.
guard let에서 optional을 unwrapping해주면,
이제부터는 변수가 nil이 아니라는 것을 확인했기 때문에,
non-optional로서 사용이 가능해집니다.
func processUsername(_ username: String?) {
guard let username = username else {
print("사용자 이름이 없습니다.")
return
}
// 여기서부터 non-optional String으로 사용 가능
print("안녕하세요, \(username)님!")
// username 변수는 함수의 나머지 부분에서 계속 사용 가능
let usernameLength = username.count
print("사용자 이름의 길이: \(usernameLength)")
}
이런 식으로 nil을 피해서,
중첩된 if 문을 만들지 않고,
코드의 흐름을 단순화할 수 있습니다.
1-2. if let과의 비교
swift에는 if let이라는 것도 있습니다.
첫번째 블록에서는,
unwrapping된 변수를 사용할 수 있지만,
2번째 블록이나,
그 아래줄에서는 unwrapping된 변수를 사용할 수 없습니다.
func greetUser(name: String?) {
if let name = name {
print("안녕하세요, \(name)님!")
// name은 이 블록 내에서만 사용 가능
} else {
print("이름을 찾을 수 없습니다.")
}
// 여기서 guard let과는 다르게 unwrapping된 name을 사용할 수 없음
}
guard let은 한번 unwrapping해서,
계속 사용할 수 있었는데요.
if let에서는 첫번째 블록에서만, unwrapping해서 사용할 수 있습니다.
한가지 더 알아두면 좋은 것은,
guard let에서 else블록이 필수였던 것에 반해,
if let에서는 else블록이 필수는 아닙니다.
if let error = error {
print("Error 발생: \(error.localizedDescription)")
return
}
정리해 보면,
if let과 guard let은 각각 아래의 경우에 사용하면 좋습니다.
- if let: 특정 조건에서만 실행해야 하는 코드가 있을 때의 조건부 실행
- guard let: 함수나 메서드를 계속 진행하기 위한 전제 조건을 확인할 때
2. 동시에 여러 Optional 을 unwrapping 하기
optional인 하나의 변수만을 unwrapping하는 것이 아니라,
동시에 여러가지 변수를 unwrapping하고,
조건에 맞지 않으면 조기에 return하거나 throw해서 빠져 나올 수 있습니다.
func userInfo(name: String?, age: Int?) {
guard let name = name, let age = age else {
print("유효하지 않은 사용자 정보입니다.")
return
}
print("\(name)님은 \(age)세입니다.")
}
3. nil뿐만 아니라, 다른 조건도 추가해서 사용가능
guard let을 이용해서,
nil에 대한 확인 뿐만이 아니라,
다른 조건도 같이 체크할 수 있습니다.
func validateUser(name: String?, age: Int?) {
guard let name = name, let age = age, age >= 18 else {
print("유효하지 않은 사용자 또는 성인이 아닙니다.")
return
}
print("\(name)님은 성인입니다.")
}
'iOS, Swift > Swift' 카테고리의 다른 글
Swift enum 총정리 (1) | 2025.03.31 |
---|---|
Swift Parameter Label(매개변수 라벨) as 사용방법 정리 (0) | 2025.03.15 |
Swift Closure의 강한 캡처와 [weak self]의 필요성 (2) | 2025.03.14 |
Swift inout parameter(파라미터) 함수 마스터하기 (0) | 2025.03.13 |
Swift 불투명 타입 some은 왜 필요할까? (0) | 2025.03.08 |
댓글