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상태에서는 종료시키ㅣ지 않는다.
그래서 이 세팅들은 어디서 보는데.....?
'Swift' 카테고리의 다른 글
초기화(initialization.. 편의? 지정?) (0) | 2024.03.05 |
---|---|
Function(1급시민 , inout & 클로저✨) (0) | 2024.03.04 |
LLVM? Swift가 컴파일되는 과정 Swift 기초 (0) | 2024.03.01 |
Swift 5.9 Updates (2) | 2023.10.10 |
Combine(2)- Operator (1) | 2023.10.08 |