[Swift 기초] assert와 guard

2022. 4. 5. 14:51Swift 기초 정리

728x90

//공부 기록용 포스팅입니다. 틀린 부분이 있을 경우 댓글로 알려주시면 감사합니다! 😎

 

 

 

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

1. assert 함수

assert(::file:line:)
assert(condition: Bool)
  • 디버깅 중 조건의 검증을 위해 사용
    • condition이 true인 경우 그냥 지나침
    • 그렇지 않은 경우에는 메세지를 출력하고 동작을 중지시킴
  • 디버깅 모드에서만 동장
var someInt: Int = 0

//조건이 true인 경우 그냥 지나치고 그렇지 않으면 메세지를 출력하고 동작을 중지시킴
assert(someInt == 0, "someInt != 0")
someInt = 1

//assert(someInt == 0)
    //Assertion failed
    //동작 중지, 검증 실패
//assert(someInt == 0, "someInt != 0")
    //Assertion failed: someInt !=0
    //동작 중지, 검증 실패, 메세지 출력

func functionWithAssert(age: Int?){
    assert(age != nil, "age == nil")
    assert((age! >= 0) && (age! <= 130), "나이값 입력이 잘못되었습니다.")
    
    //위 assert를 모두 통과하면
    print("당신의 나이는 \\(age!)세 입니다.")
}

functionWithAssert(age: 50) //당신의 나이는 50세 입니다.
//functionWithAssert(age: -1) //Assertion failed: 나잇값 입력이 잘못되었습니다.
//functionWithAssert(age: nil)  //Assertion failed: age == nil

2. guard 구문

  • 조건이 충족되지 않았을 경우 수행되며, 이후의 문장들이 안전하게 수행되도록 보장하는 역할
    • 잘못 된 값의 전달 시 특정 실행구문을 빠르게 종료한다.
    • 디버깅 모드 뿐만 아니라 어떤 조건에서도 동작한다.
  • guard의 else 블럭 내부에는 특정 코드 블럭을 종료하는 지시어(return, break) 필수
  • guard let은 if let과 다르게 블럭 밖에서도 사용할 수 있다
    • guard 조건문을 통과하면 옵셔널 변수는 자동 해제된다.
  • 타입 캐스팅, 옵셔널과 자주 사용됨.
    • 비옵셔널 값에 대해서도 사용가능
  • 그 외에도 단순 조건 판단 후 빠르게 종료할 떄 용이
func functionWithGuard(age: Int?){

    //옵셔널 바인딩 실행 - age가 nil이면 바로 return
    //guard에는 else가 필수. 조건과 맞지 않으면 else와 return
    //return이 없으면 컴파일 되지 않음
    //unwrappedAge는 암시적 해제됨
    guard let unwrappedAge = age, unwrappedAge < 130, unwrappedAge >= 0 else {
        print("나이값 입력이 잘못되었습니다.")
        return
    }

    //guard let은 if let과 다르게 블럭 밖에서도 사용할 수 있다.
		//guard-else 문에 의해 암시적 해제되었기 때문에 unwrappedAge를 바로 사용할 수 있다.
    guard unwrappedAge < 100 else{
        return 
    }
    
    //위 guard문과 동일한 내용
//    if unwrappedAge < 100 {
//        
//    }else {
//        return 
//    }
    
		//guard let 구문을 모두 통과하면
    print("당신의 나이는 \\(unwrappedAge)세 입니다.")
}

functionWithGuard(age: 180)  //나이값 입력이 잘못되었습니다.
functionWithGuard(age: 13)  //당신의 나이는 13세 입니다.

2-1. while문에서의 guard 구문

//반복문에서도 사용할 수 있다.
var count = 1
while true{
    guard count < 3 else{
        break
    }
    print(count)
    count += 1
}

//1
//2

2-2. dictionary를 사용한 guard 구문

  • dictionary 값은 모두 옵셔널 - 키에 해당되는 값이 없을 수도 있기 때문
//dictionary에서 활용 - dictionary값은 모두 옵셔널: 키에 해당되는 값이 없을수도 있기 때문에
func someFunction(info: [String: Any]){
    //dictionary에서 name이라는 값을 꺼내와서 캐스팅을 시도(Any타입이라서)
    guard let name = info["name"] as? String else{
        return
    }
    
    guard let age = info["age"] as? Int, age >= 0 else{
        return 
    }
    
    //guard let을 모두 통과하면
    print("\\(name): \\(age)")
}

someFunction(info: ["name": "ㄱㅅㄱ", "age": 100]) //ㄱㅅㄱ: 100
someFunction(info: ["name": "ㄱㅅㄱ"] )
someFunction(info: ["name": "ㄱㅅㄱ", "age": "100"])

 

 

 

 

참고하였습니다. 감사합니다.

https://yagom.net/courses/swift-basic/lessons/assert와-guard/

https://www.inflearn.com/course/창원대학교-박동규-교수의-swift-기초-강좌/lecture/1904?tab=note&mm=null 

 

728x90