Swift에서 Int형 switch case의 트랩(?)

3282 단어 Swift
스위프트의 switch-case는 사용 범위가 있어 매우 편리하지만 인트형의'범위'사용 방법에는 의외의 함정이 있다.예를 들어 Playground에서 다음 코드를 써 봅니다.
let a = 0
switch a {
case Int.min ..< 0:
    print("負数")

case 0:
    print("零")

case 1 ... Int.max:
    print("正数")

default:
    fatalError("俺はプログラマをやめるぞ!")
}
응, 그러면 결과는 네가 알고 있는 대로'0'을 출력할 거야.수정let a = -1을 시도하면'음수'가 출력됩니다.그럼 수정let a = 1해보면 어떻게 될까요?
네, 정답은: 운행 시간 오류!

이유는 간단하다. 실제로case 글 뒤에 쓴 범위는 기본적으로Range로 여겨진다.스위프트Range에서 Range.startIndex ..< Range.endIndex처럼 표현된 것이다. 즉, 마지막에 쓴 것이 case 1 ... Int.max든 실제로case 1 ..< Int.max.successor(), 즉 endIndexInt.max + 1로 처리된 것이다.물론 이미Int.max인데 조금만 더 넣으면 표현이 안 되고 운행시간 오류가 돼요.
사실 이 Stackoverflow를 발견한 사람이 있는데 어쩔 수 없이 사과는 고칠 뜻이 없는 것 같다.그래서 이건 어쨌든 원본 코드로만 수정할 수 있어요.뭐, 가장 간단한 방법으로
case 1 ..< Int.max, Int.max:
그리고, 제작1 ..< Int.maxRange 거기에 또 다른Int.max 방법을 추가하는 건가요?아니면'이렇게 쓰면 안 예뻐!'만약 이렇게 생각한다면 아래의 작법도 괜찮다.
case ClosedInterval(1 ... Int.max):
이렇게 쓰면 강제적Range이 아니라ClosedInterval으로case범위를 정하는 것도 방법이다.
어쨌든 Int형이니까 처음부터 Interval 범위 내에서 하면 돼요.
p.s. 그리고 이미 case에 모든 Int의 상황을 열거했으니, 그럼에도 불구하고 default라고 써야 하는 사과님의 바보!

좋은 웹페이지 즐겨찾기