Swift에서 Int형 switch case의 트랩(?)
3282 단어 Swift
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()
, 즉 endIndex
는 Int.max + 1
로 처리된 것이다.물론 이미Int.max
인데 조금만 더 넣으면 표현이 안 되고 운행시간 오류가 돼요.사실 이 Stackoverflow를 발견한 사람이 있는데 어쩔 수 없이 사과는 고칠 뜻이 없는 것 같다.그래서 이건 어쨌든 원본 코드로만 수정할 수 있어요.뭐, 가장 간단한 방법으로
case 1 ..< Int.max, Int.max:
그리고, 제작1 ..< Int.max
의Range
거기에 또 다른Int.max
방법을 추가하는 건가요?아니면'이렇게 쓰면 안 예뻐!'만약 이렇게 생각한다면 아래의 작법도 괜찮다.case ClosedInterval(1 ... Int.max):
이렇게 쓰면 강제적Range
이 아니라ClosedInterval
으로case
범위를 정하는 것도 방법이다.어쨌든
Int
형이니까 처음부터 Interval
범위 내에서 하면 돼요.p.s. 그리고 이미
case
에 모든 Int
의 상황을 열거했으니, 그럼에도 불구하고 default
라고 써야 하는 사과님의 바보!
Reference
이 문제에 관하여(Swift에서 Int형 switch case의 트랩(?)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/lovee/items/31bc2b4e66a93944c9a6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)