TIL38 - Assert & Guard
assert와 guard
애플리케이션 동작 도중에 생성하는 다양한 결과값으 동적으로 확인하고 안전하게 처리할 수 있도록 도움을 준다.
assert
이때 assertion은 어떤 조건들을 가지고 확인해보는데 사용될 수 있으며, assert라는 함수를 사용하고, 실제 배포되는 애플리케이션에서 작동하지 않고 디버깅 모드에서만 작동한다.
var someInt: Int = 0
assert(someInt == 0, "someInt is not equal to 0) //검증 조건에 부합했기 때문에 패스됩니다.
디버깅중 내가 예상했던 조건들이 맞는지 검증하는데 사용되며, 정수값이 만약 있을때 예상했던 값과 맞는지 확인하기 위해서 assert함수를 사용하는것이 가능하다. 이때 메세지를 부가적으로 적어도 되고 안해도 된다.
func functionWithAssert(age: Int?){
assert(age != nil, "age == nil")
assert((age! >= 0) && (age! <= 130), "나이값 입력이 잘못되었습니다.")
print("당신의 나이는 \(age!) 입니다.")
}
assert 경우 매개변수를 통해서 전달된 전달인자를 검사하거나 매개변수가 옵셔널 타입일 때 nil인 것을 검증을 할수 있다.
gurad
디버깅 모드에서만 사용할 수 있는 assert와 달리 guard는 어떤 조건에서도 사용 가능하다.
early exit을위해서 사용하는 가드구문으로서, 빠른 종료를 위해서 사용하기 때문에 return break같은 구문종료 키워드가 필요하다.
옵셔널 바인딩
func functionWithGuard(age: Int?){
guard let unwrappedAge = age, unwrappedAge < 130,
unwrappedAge >= 0 else {
print("나이값 입력이 잘못되었습니다.")
return
}
print("당신의 나이는 \(unwrappedAge)입니다.") // !를 쓰지 않는 이유는 if let구문과 같이 옵셔널 바인딩 방식을 사용헀기 때문이라고 생각함.
}
assert와 다르게 가드구문을 통해 옵셔널 바인딩과 연결시켜주면 age가 nil이라면 리턴되고 이때 리턴 명시를 하지 않았다면 컴파일러가 오류를 보내준다.(빠른 종료를 위한 구문인데 종료 지시어가 없기 떄문이다.)
~~그래서 가드를 통과하게 되면, 언랩핑한 것이 if let은 brace뿐 아니라 밖에서도 밑에서도 사용이 가능하다. 이때 함수 안 뿐만 아니라 반복문에서도 사용이 가능하다. ~~
댓글
