The Basics - 어설션, 프리컨디션 Swift


어설션과 프리컨디션

어설션과 프리컨디션은 런타임에서 실행된다. 추가적인 코드를 호출하기전에 필수적인 조건이 만족되는지 살펴보는데 이들을 사용한다. 어설션내의 불린조건이나 프리컨디션이 참을 나타내면 코드는 보통대로 실행된다. 만약 거짓이라면 현 프로그램 상태가 무효한것이되고 앱은 종료된다.

어설션과 프리컨디션은 코딩중에 기대하는 것을 미리 지정하여 코드의 일부로 포함할 수 있게 한다. 어설션은 개발중에 실수나 잘못된 가정을 쉽게 찾을 수 있게 하고 프리컨디션은 제작중에 이슈를 감지할 수 있게 한다.

실시간에서 기대하는 값을 확인하는 것과 함께 어설션은 코드내에서 유용한 문서화가 되기도 한다. 위에서 다룬 에러핸들링과 달리 어설션과 프리컨디션은 회복가능하거나 기대되는 에러를 위해 사용되지 않는다. 실패한 어설션과 프리컨디션은 무효한 프로그램 상태를 나타내며 실패한 어설션을 잡는 방법은 없다.

어설션과 프리컨디션을 사용하는 것은 발생하지 않는 무효한 조건을 디자인하기위한 대체ㅔ대는 아니다. 그러나, 유효한 데이터와 상태로 연결하여 무효한 상태가 발생하면 앱을 종료할 수 있게 하고 디버그를 쉽게 해준다. 무효한 상태에서 실행을 중지시키는 것은 무효한 상태에서 발생할 위험을 한정시키는데 도움을 준다.

어설션과 프리컨디셔난의 차이는 이들이 체크될 때이다. 어설션은 디버그 빌드에서만 체크되지만 프리컨디션은 디버그와 프로덕션 빌드 모두에서 실행된다. 프로덕션 빌드에서 어설션 내의 조건은 실행되지 않는다. 이 의미는 어설션은 프로덕션단계의 성능에 영향을 끼치지 않고 개발단계에서만 실행되게한다는 의미이다.

어셜션으로 디버깅

assert(_:_:file:line:) 함수를 호출해 어설션을 작성한다. 이 함수에 익스프레션을 건내주면 불린을 확인하고 거짓일 때 메시지를 보여준다.

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

In this example, code execution continues if age >= 0 evaluates to true, that is, if the value of age is nonnegative. If the value of age is negative, as in the code above, then age >= 0 evaluates to false, and the assertion fails, terminating the application.

You can omit the assertion message—for example, when it would just repeat the condition as prose.

assert(age >= 0)
If the code already checks the condition, you use the assertionFailure(_:file:line:) function to indicate that an assertion has failed. For example:

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.")
}

프리컨디션 시행

프리컨디션은 조건이 잠재적으로 거짓일 때 사용하며, 실행을 계속하려면 반드시 참이어야 할 때는 나타낸다. For example, use a precondition to check that a subscript is not out of bounds, or to check that a function has been passed a valid value.

You write a precondition by calling the precondition(_:_:file:line:) function. You pass this function an expression that evaluates to true or false and a message to display if the result of the condition is false. For example:

// In the implementation of a subscript...
precondition(index > 0, "Index must be greater than zero.")
You can also call the preconditionFailure(_:file:line:) function to indicate that a failure has occurred—for example, if the default case of a switch was taken, but all valid input data should have been handled by one of the switch’s other cases.

일러두기)
If you compile in unchecked mode (-Ounchecked), preconditions aren’t checked. The compiler assumes that preconditions are always true, and it optimizes your code accordingly. However, the fatalError(_:file:line:) function always halts execution, regardless of optimization settings.

You can use the fatalError(_:file:line:) function during prototyping and early development to create stubs for functionality that hasn’t been implemented yet, by writing fatalError("Unimplemented") as the stub implementation. Because fatal errors are never optimized out, unlike assertions or preconditions, you can be sure that execution always halts if it encounters a stub implementation.



덧글

댓글 입력 영역