[Swift] Assertions, Preconditions

팔랑이·2023년 6월 9일
post-thumbnail

23.04.26

Assertions and Preconditions

Assertion과 preconditions를 사용해 다른 코드들을 실행하기 전에 필수조건들이 충족되었는지를 런타임 도중에 확인할 수 있다. Assertion이나 preconditions 안의 Bool이 true로 판정되면 코드는 평소처럼 실행된다. 이 조건이 false로 판정되면 코드 실행이 종료된다.

Assertion과 preconditions를 통해 코딩을 하며 가지는 가정과 기대를 코드 안에 포함하여 표현할 수 있다. Assertion은 개발 도중에서 발생한 실수와 잘못된 가정을 찾아주고, Precondition은 이슈를 찾아낸다.

Assertion과 preconditions는 개발자가 가지는 기대와 가정을 런타임 도중 확인해줄 뿐더러 코드 내에서 유용한 문서의 형식이 된다. 에러 처리에서 다뤘던 에러조건들과 달리, Assertions과 preconditions는 복구 가능하고 예상 가능한 에러들을 다루지 않는다. 실패한 assertions과 preconditions는 실패한 프로그램을 뜻하기 때문에, 실패한 assertion을 잡아낼 수 없다.

// 뭔말이여...

Assertions와 preconditions를 사용하여 명료한 데이터와 상태를 강제하는 것은 invalid한 상황이 일어났을 때 app을 더 예측 가능한 상황에서 종료하고 이를 더 쉽게 디버깅 할 수 있게 해준다. invalid한 상태가 발견되는 즉시 실행을 종료하는 것은 에러로부터 발생할 수 있는 손상들의 범위를 줄여준다.



Debugging with Assertions

Swift standard 라이브러리에서 assert(::file:line) 함수를 호출해 Assertioon을 작성할 수 있다. 이 함수가 true나 false로 표현될 때 작동하며, 조건식이 false일 때 메시지를 표시한다. 다음과 같이 예를 들 수 있다.

let age = -3
assert(age >=0, "A person's age can't be less than zero.")
// This assertion fails because -3 isn't >=0.

위의 예시에서, age>=0이 true로 판명될 시 코드는 정상적으로 실행된다. 위와 같이 age의 값이 negative일 때 age>=0은 false로 판명되고, assertion이 fail해 실행되던 어플리케이션을 종료한다.

다음과 같이 assertion message를 생략할 수도 있다.

assert(age >= 0)

코드 내애서 이미 조건을 식별했다면, assertionFailure(_:file:line:) 함수식을 사용해 assertion이 fail했음을 알려줄 수 있다.

if age > 10{
    print("You can ride the roller-coaster or the ferris wheel.")
} else if age >= 0 {
    print("You can ride the ferris wheel.")
} else {
    assertionFailure("A person's age can't be less than zero.:)
}



Enforcing Preconditions

조건이 false가 될 가능성이 있지만, 코드를 실행할 때에는 반드시 true가 되어야 할 때 precondition을 사용한다. 예를 들어, 함수가 유효한 값을 가지고 있는지, 또는 subscript가 범위를 벗어나지 않았는지 등을 체크할 때 사용한다.

precondition(::file:line:) 함수를 호출해 preconditions를 사용한다. 이 함수를 통해 true나 false의 값이 판명될 때 적용될 수 있고, 결과값이 false일 때 메시지가 전달된다.

// In the implementations of a subscript...
precondition(index > 0, "Index must be grater than zero")

failure가 발생할 시 preconditionFailure(_:file:line:) 함수를 호출할 수 있다.


The Basics 훑기 끝. 이해 안된거 댕많지만 차차 하면서 이해되리라 믿고 넘어간다.

🌏 참고사이트
Swift Language Guide

profile
정체되지 않는 성장

0개의 댓글