[Swift] assert와 guard

선주·2022년 4월 11일
0

Swift

목록 보기
11/20

어플리케이션이 동작 도중에 생성하는 다양한 결과값을 동적으로 확인하고 안전하게 처리할 수 있도록 한다.

assert

assert 함수는 디버깅 모드에서만 동작하며, 주로 디버깅 중 조건의 검증을 위해 사용한다.

var someInt: Int = 0
assert(someInt == 0, "someInt != 0")

assert함수의 someInt == 0 조건이 맞으면 아래 줄로 넘어가지만, 아니라면 "someInt != 0" 메시지를 띄우고 동작을 중지시킨다. 이 메시지는 편의에 따라 적어도 되고 안 적어도 된다.

guard

guard 키워드를 사용하면 잘못된 값이 전달될 시 특정 실행구문을 빠르게 종료한다. 디버깅 모드 뿐 아니라 어떤 조건에서도 동작한다.

else 블럭과 꼭 함께 쓰여야 하고, 빠른 종료를 위한 구문이기 때문에 else 블럭 내부에는 특정 코드블럭을 종료하는 지시어(return, break 등)가 꼭 있어야 한다.

guard let unwrappedAge = age,
    unwrappedAge < 130,
    unwrappedAge >= 0 else {
    print("나이값 입력이 잘못되었습니다")
    return
}
    
print("당신의 나이는 \(unwrappedAge)세입니다")

let으로 언래핑해서 옵셔널바인딩을 먼저 실행하면 age가 nil일 경우 바로 return된다. nil이 아니라면 unwrappedAge < 130과 unwrappedAge >= 0 조건을 검사하고, 조건에 부합하지 않는다면 else로 들어와 return된다.

if let 구문과는 달리 guard let은 블럭을 벗어나도 unwrappedAge 변수를 계속 사용할 수 있다.


var count = 1

while true {
    guard count < 3 else {
        break
    }
    print(count)
    count += 1
}

반복문과도 함께 쓰일 수 있다.


딕셔너리에서 값을 꺼내면 항상 옵셔널이기 때문에 주로 딕셔너리와 함께 자주 사용된다.

func someFunction(info: [String: Any]) {
    guard let name = info["name"] as? String else { // ①
        return
    }
    
    guard let age = info["age"] as? Int, age >= 0 else { // ②
        return
    }
    
    print("\(name): \(age)")
}

someFunction(info: ["name": "jenny", "age": "10"])
someFunction(info: ["name": "mike"])
someFunction(info: ["name": "yagom", "age": 10]) // yagom: 10

info["name"]은 값이 있다면 Any타입이기 때문에 String타입으로 한 번 캐스팅해주고, 정상 값이라면 name에 값이 반환된다. 그렇지 않다면 return되어 빠르게 종료된다.

② 마찬가지로 Int타입으로 캐스팅해주고, 이 경우는 age에 반환된 값을 age >= 0으로 한 번 더 검증한다. 조건을 만족하지 못하면 return된다.



야곰의 스위프트 기본 문법 강좌를 수강하며 작성한 내용입니다.

profile
기록하는 개발자 👀

0개의 댓글