iOS 응용 (swift)
[iOS - Swift] Optimization Level 개념과 assert, assertFailure, precondition, preconditionFailure, fatalError 사용 방법
jake-kim
2022. 12. 13. 23:21
Optimization Level 종류
*Optimization Level이란? 컴파일러 옵션의 종류를 의미
- Onone: debug 모드 (최소한의 최적화와 디버그 정보 기록 o)
- O: release 모드 (최적화 수행과 디버그 정보 기록 x)
- Osize: 성능보다 코드 사이즈를 줄이는 것에 최적화

Optimization Level 설정 방법
- Xcode > Build Settings > Swift Compiler - Optimization Level에서 설정

- Debug의 디폴트값은 -Onone (최적화는 되지 않지만 디버그 정보 기록 o)
- Release의 디폴트값은 -O (최적화하고 디버그 정보 기록 x)
cf) Apple Clang - Code Generation 부분은 Objective-C 옵션

assert, assertFailure, precondition, preconditionFailure, fatalError 의미
- assert: 내부 조건이 false가 되면 runtime error를 발생하여, 주의해야한다는 의미로 사용
assert(val % 2 == 0, "this is assert message")
- assertionFailure: 별도의 조건은 없고 바로 runtime error 발생
assertionFailure("this is assertionFailure message")
- precondition: assert는 true여야 runtime error가 나지만, precondition은 false여야 runtime error 발생
precondition(val % 2 == 1, "this is precondition message")
- preconditionFailure: 별도의 조건은 없고 바로 runtime error 발생
preconditionFailure("this is preconditionFailure message")
- fatalError: 별도의 조건이 없고, 무조건 runtime error 발생
fatalError("this is fatalError message")
적용되는 범위
(-Oneon은 debug모드의 디폴트 값, -O은 Release 모드의 디폴트 값)
- assert, assertFailure: -Onone일때만 활성화
- precondition, preconditoinFailure: 항상 활성화
- fatalError - 항상 활성화
결론
- debug 모드 (Onone) 에서만 runtime error가 나가끔 하려면 assert, assertFailure 사용
- release 모드 (O) 에서도 runtime error가 나게끔 하려면 precondition, preconditionFailure 사용
- assert, precondition 조건 없이 에러가 나는 의미를 전달하고 싶을땐 fatalError 사용
* 참고
https://developer.apple.com/documentation/swift/1539616-assertionfailure
https://developer.apple.com/documentation/swift/1541112-assert
https://github.com/apple/swift/blob/main/docs/OptimizationTips.rst#enabling-optimizations
https://eunjin3786.tistory.com/453
https://developer.apple.com/forums/thread/111158