답변:
한 가지 방법이 있습니다. 가정 someVar
되는 Int
등 Comparable
, 선택적 새로운 변수로 피연산자를 할당 할 수 있습니다. where
키워드를 사용하여 원하는 범위를 지정할 수 있습니다 .
var someVar = 3
switch someVar {
case let x where x < 0:
print("x is \(x)")
case let x where x == 0:
print("x is \(x)")
case let x where x > 0:
print("x is \(x)")
default:
print("this is impossible")
}
이것은 약간 단순화 될 수 있습니다 :
switch someVar {
case _ where someVar < 0:
print("someVar is \(someVar)")
case 0:
print("someVar is 0")
case _ where someVar > 0:
print("someVar is \(someVar)")
default:
print("this is impossible")
}
where
범위 일치로 키워드를 완전히 피할 수도 있습니다 .
switch someVar {
case Int.min..<0:
print("someVar is \(someVar)")
case 0:
print("someVar is 0")
default:
print("someVar is \(someVar)")
}
default: fatalError()
가능한 논리 오류를 조기에 감지하는 것이 좋습니다 .
assertionFailure
은 특히 팀에서 작업 할 때 더 안전한 옵션 인 것 같습니다.
Swift 5에서는 if 문을 대체하기 위해 다음 스위치 중 하나를 선택할 수 있습니다.
PartialRangeFrom
하고PartialRangeUpTo
let value = 1
switch value {
case 1...:
print("greater than zero")
case 0:
print("zero")
case ..<0:
print("less than zero")
default:
fatalError()
}
ClosedRange
하고Range
let value = 1
switch value {
case 1 ... Int.max:
print("greater than zero")
case Int.min ..< 0:
print("less than zero")
case 0:
print("zero")
default:
fatalError()
}
let value = 1
switch value {
case let val where val > 0:
print("\(val) is greater than zero")
case let val where val == 0:
print("\(val) is zero")
case let val where val < 0:
print("\(val) is less than zero")
default:
fatalError()
}
_
let value = 1
switch value {
case _ where value > 0:
print("greater than zero")
case _ where value == 0:
print("zero")
case _ where value < 0:
print("less than zero")
default:
fatalError()
}
RangeExpression
프로토콜 ~=(_:_:)
운영자 와 함께 스위치 사용let value = 1
switch true {
case 1... ~= value:
print("greater than zero")
case ..<0 ~= value:
print("less than zero")
default:
print("zero")
}
Equatable
프로토콜 ~=(_:_:)
운영자 와 함께 스위치 사용let value = 1
switch true {
case value > 0:
print("greater than zero")
case value < 0:
print("less than zero")
case 0 ~= value:
print("zero")
default:
fatalError()
}
PartialRangeFrom
, PartialRangeUpTo
그리고 RangeExpression
S ' contains(_:)
방법let value = 1
switch true {
case (1...).contains(value):
print("greater than zero")
case (..<0).contains(value):
print("less than zero")
default:
print("zero")
}
0.1
때문에 치명적인 오류가 발생 1...
하는 경우이 솔루션은 1에서 커버 숫자 만 작동 그래서 value
입니다 Int
변수 유형은 어떤 컴파일러 오류없이 기능 구분을 변경하면 있기 때문에 그 위험합니다.
switch
후드 아래 의 문장은 ~=
연산자를 사용합니다 . 그래서 이거:
let x = 2
switch x {
case 1: print(1)
case 2: print(2)
case 3..<5: print(3..<5)
default: break
}
이것에 대한 설탕 제거 :
if 1 ~= x { print(1) }
else if 2 ~= x { print(2) }
else if 3..<5 ~= x { print(3..<5) }
else { }
표준 라이브러리 참조를 살펴보면 ~=
오버로드가 무엇 을 수행 하는지 정확하게 알 수 있습니다 : 포함은 범위 일치 및 동일 항목과 동일합니다. (포함되지 않은 열거 형 대소 문자는 표준 라이브러리의 함수가 아닌 언어 기능입니다)
왼쪽의 직선 부울과 일치하지 않는 것을 볼 수 있습니다. 이러한 종류의 비교를 위해서는 where 문을 추가해야합니다.
~=
운전자 에게 과부하가 걸리지 않으면 ... (일반적으로 권장 되지 않음) 한 가지 가능성은 다음과 같습니다.
func ~= <T> (lhs: T -> Bool, rhs: T) -> Bool {
return lhs(rhs)
}
왼쪽의 부울을 오른쪽의 매개 변수로 반환하는 함수와 일치합니다. 사용할 수있는 종류는 다음과 같습니다.
func isEven(n: Int) -> Bool { return n % 2 == 0 }
switch 2 {
case isEven: print("Even!")
default: print("Odd!")
}
귀하의 경우 다음과 같은 진술이있을 수 있습니다.
switch someVar {
case isNegative: ...
case 0: ...
case isPositive: ...
}
하지만 지금은 새로운 정의해야 isNegative
하고 isPositive
기능을. 더 많은 연산자를 오버로드하지 않으면 ...
일반 접두사 연산자를 오버로드하여 접두사 또는 접미사 연산자로 만들 수 있습니다. 예를 들면 다음과 같습니다.
postfix operator < {}
postfix func < <T : Comparable>(lhs: T)(_ rhs: T) -> Bool {
return lhs < rhs
}
이것은 다음과 같이 작동합니다.
let isGreaterThanFive = 5<
isGreaterThanFive(6) // true
isGreaterThanFive(5) // false
이를 이전 함수와 결합하면 switch 문이 다음과 같이 보일 수 있습니다.
switch someVar {
case 0< : print("Bigger than 0")
case 0 : print("0")
default : print("Less than 0")
}
이제는 실제로 이런 종류의 것을 사용해서는 안됩니다. 당신은 (아마도) where
진술을 고수하는 것이 좋습니다 . 즉, 스위치 문 패턴
switch x {
case negative:
case 0:
case positive:
}
또는
switch x {
case lessThan(someNumber):
case someNumber:
case greaterThan(someNumber):
}
고려할만한 가치가있는 것 같습니다.
이것은 범위가 어떻게 보이는지입니다.
switch average {
case 0..<40: //greater or equal than 0 and less than 40
return "T"
case 40..<55: //greater or equal than 40 and less than 55
return "D"
case 55..<70: //greater or equal than 55 and less than 70
return "P"
case 70..<80: //greater or equal than 70 and less than 80
return "A"
case 80..<90: //greater or equal than 80 and less than 90
return "E"
case 90...100: //greater or equal than 90 and less or equal than 100
return "O"
default:
return "Z"
}
<0
표현은 (이상?) 작동하지 않습니다 나는이와 결국 있도록 :
스위프트 3.0 :
switch someVar {
case 0:
// it's zero
case 0 ..< .greatestFiniteMagnitude:
// it's greater than zero
default:
// it's less than zero
}
X_MAX
로 대체되었습니다 .greatestFiniteMagnitude
, 즉 Double.greatestFiniteMagnitude
, CGFloat.greatestFiniteMagnitude
등등 그래서 일반적으로, 당신은 할 수 case 0..< .greatestFiniteMagnitude
의 종류부터 someVar
이미 알려져있다
var timeLeft = 100
switch timeLeft {case 0...<=7200: print("ok") default:print("nothing") }
가 왜 <=
인식되지 않습니까? 내가 동등하게 쓰지 않으면 효과가 있습니다. 감사합니다
someVar
이었다 Int
내가해야 할 일을했을 Double(
의 somevar를가 ... 작동하도록`)