UInt 값끼리 ‘-‘연산할 때 예외 처리

Updated:

문제

UInt 값끼리 빼는 코드의 에러 발생에 대해서 생각하지 못했고, 코드 리뷰에서 알게 되어 수정하려 했다.

2020.11.26 수정

굳이 조건식에서 형변환하면서 -연산 할 필요없고 아래 처럼 비교연산 하면 간단히 해결 가능했다. 삽질의 기록을 위해 잘못된 예시를 남겨둔다.

// 수정한 예시
func minus(number: UInt) -> Bool {
    var origin: UInt = 3
    
    guard origin >= number else {
        return false
    }
    
    origin -= number
    return true
}

잘못된 예시

// 예시
func minus(number: UInt) {
    var origin: UInt = 3
    
    origin -= number
}

위 코드에서는 number가 3이하라면 UInt값 사이의 -연산 결과가 0 이상이므로 에러가 나지 않지만, 만약 number 값을 4 이상 준다면 UInt 타입은 음수를 저장할 수 없으므로 에러가 발생한다.

그래서 미리 예외 처리를 하고 싶었다.

// 예시
func minus(number: UInt) -> Bool {
    var origin: UInt = 3
    
    guard origin - number >= 0 else {
        return false
    }
    
    origin -= number
    return true
}

이러면 될까? (안된다.)

guard else 구문에서 else 구문에 “Will never be executed” 경고가 뜨며, numberd 에 4이상 값을 넣으면 guard else에서 거르지 못하고 에러난다.

UInt끼리의 연산에서 음수 자체가 나오면 안 되는 것 같다.

잘못된 해결 방법

// 예시
func minus(number: UInt) -> Bool {
    var origin: UInt = 3
    
    guard Int(origin) - Int(number) >= 0 else {
        return false
    }
    
    origin -= number
    return true
}

UInt -> Int로 형변환해서 먼저 검사하도록 했다.

이렇게 하면 경고도 뜨지 않고, 연산 값이 음수가 되는 경우 guard else 구문에서 걸러진다.

Leave a comment