본문 바로가기
iOS, Swift/Swift

Swift guard let 이용한 Optional unwrapping 방법

by Developer88 2025. 3. 12.
반응형

오늘은 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)님은 성인입니다.")
}

 

728x90

댓글