면접준비

Assertions && Preconditions

2료일 2024. 3. 2. 21:28

Swift기본을 다지기 위해 공부하던중 역설과 전제조건....뭐야 왜이렇게 입에 안달라붙고 한국어가 어렵냐..하며 찾아봤다...

- Runtime시 발생하는 조건

- 불값이 true면 코드가 진행되고 false면..? 종료시킬수 있음 

- 역설은 개발과정에서의 실수를 찾는데 도움을 주고 전제조건은 프로덕션문제 감지하는데 도움을 준다.

=> 유효하지 않은 조건이 발생하지 않도록 코드를 디자인하기 위해 사용한다.

뭐가다른데?

  • 역설은 오직 디버그 빌드에서만 체크(프로덕션에서는 영향을 안주기에 개발단계에서 많이 해도 상관없다)
  •  전제조건은 디버그와 프로덕션 빌드에서 체크
    • 출시할때 엄청 크리티컬한거 예를들면 어? 이 함수 저번 버전인데 우리 업데이트했는데? 그래서 안바꾸면 API통신 안될텐데.?

 

프로덕션하고 디버그 차이는 뭔데 ?

프로덕션이란 소프트웨어나 앱이 최종적으로 실 유저들에게 제공되는 실행되는 환경을 말한다. 즉 더 최적화되고 안정화 된 상태를 말한다.

디버그 빌드는 최적화를 하지 않는다. 그냥 에러가 있는지를 판단하는 것이기에 assert문을 막써도 된다는 것이다. (추후에 설정해줘야함)

Assert

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

여기서 false가 되기 때문에 앱은 종료된다.

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

만약 조건체크를 이미 사용하고 있다면 이런식으로 assertionFailure 사용하면된다.

Precondition

precondition(index > 0, "Index must be greater than zero.")

전제조건도 비슷하게 이렇게 써주면 된다. 주로 subscript범위를 벗어낫는지, function이 valid value를 받았는지 확인할때 쓴다고 한다.

디버깅모드와 배포되는 앱모두에서 동작한다!! 그러기에 배포가 이미 되었는데 어 이렇게 사용하면 안돼..막아야할때 사용

func preconditionFailure(
    _ message: @autoclosure () -> String = String(),
    file: StaticString = #file,
    line: UInt = #line
) -> Never

 

오 반환 타입이 Never네? 네버인 이후에 있는 코드는 실행시키지 않기 때문에 더 정확한 최적화를 프로덕션빌드때 할수 있다.

그런데 여기서 주의해야할 부분이 있다.

디버그 세팅에 따라 다르게 동작한다는 것을 명심해야한다. xcode default인 -Onone에서는 assert가 false일때 프로그램 실행을 디버거에서 중지시키지만 -O나 -Ounchecked에서는 조건 검사를 하지 않는다. 특히나 -Ounchecked에서는 항상 true라고 가정한다고 한다.

PreCondition도 xcode release mode에서 default인 -O에서는 precondition을 통해 False면 앱을 종료시키지만 -Ounchecked상태에서는 종료시키ㅣ지 않는다. 

 

그래서 이 세팅들은 어디서 보는데.....?