Swift

precondition(_:_:file:line:)

Phililip
728x90

안녕하세요.

 

이번에는 precondition이 뭔지 간단하게 알아볼게요.

 

 


 

# 1. precondition 이란?

precondition은 예상하지 못한 상황을 대비한 방어코드입니다.

 

 

 

condition = false 일 경우, 예상하치 못한 상황이라고 판단하여 message를 출력해주고 precondition 이후의 코드가 실행되지 않습니다.

 

func isLessThanOrEqualZero(num: Int) -> Bool {
    if num <= 0 {
        return false
    }
    return true
}

print("Before precondition")
precondition(isLessThanOrEqualZero(num: 0), "num <= 0")
print("num > 0")    // 출력되지 않음.

 

 

# 2. precondition vs assert

assert하고 차이점은 

 

assert는 디버그 빌드에서만 동작하고,

 

precondition은 디버그 & 릴리즈 빌드 모두 동작하게 됩니다.

 

 

 

# 3. Error가 발생하는 경우

아래 코드처럼 error를 던져주는 method에 precondition을 적용을 하면 에러가 발생합니다.

 

enum MyError: Error {
    case lessThanZero
}

func test(num: Int) throws ->  Bool  {
    if num < 0 {
        throw MyError.lessThanZero
    }
    return true
}

precondition(test(num: 0))    // error: call can throw, but it is executed in a non-throwing autoclosure

 

 

그 이유는 test method는 error를 던져주는데, precondition은 non-throwing 하기 때문에 에러가 발생하는 것이에요.

 

이럴 경우에는 뻔한 해결 방법이지만 try로 감싸주세요ㅎㅎ

 

enum MyError: Error {
    case lessThanOrEqualZero
}

func test(num: Int) throws ->  Bool  {
    if num <= 0 {
        throw MyError.lessThanOrEqualZero
    }
    return true
}

precondition((try? aLittle(num: 0)) ?? false)    ✅

 

 

 

 

## 참고

- https://bootstragram.com/blog/swift-precondition-that-throws/

 

 

 


 

이번 글은 여기서 마무리.

 

 

 

반응형