小于或大于Swift switch语句

我很熟悉Swift中的switch语句,但是想知道如何用switch来代替这段代码:

 if someVar < 0 { // do something } else if someVar == 0 { // do something else } else if someVar > 0 { // etc } 

这是一种方法。 假设someVar是一个Int或其他Comparable ,你可以select赋值给一个新的variables。 这使您可以使用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)") } 

switch语句下,使用~=运算符。 所以这:

 let x = 2 switch x { case 1: print(1) case 2: print(2) case 3..<5: print(3..<5) default: break } 

对此的Desugars:

 if 1 ~= x { print(1) } else if 2 ~= x { print(2) } else if 3..<5 ~= x { print(3..<5) } else { } 

如果你看一下标准的库引用,它可以准确地告诉你~=是否被重载做的事情 :包括是范围匹配,等同于相等的东西。 (不包括enum-case匹配,这是一个语言function,而不是std库中的函数)

你会发现它不符合左边的直布尔值。 对于这种比较,你需要添加一个where语句。

除非…你自己重载~=运算符。 (这通常build议)一种可能性是这样的:

 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: ... } 

但是现在你必须定义新的isNegativeisPositive函数。 除非你超载一些更多的操作员…

你可以重载正常的中缀运算符来作为curried前缀或后缀运算符。 这是一个例子:

 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语句的模式

 switch x { case negative: case 0: case positive: } 

要么

 switch x { case lessThan(someNumber): case someNumber: case greaterThan(someNumber): } 

似乎很普遍,值得考虑。

您可以:

 switch true { case someVar < 0: print("less than zero") case someVar == 0: print("eq 0") default: print("otherwise") } 

由于某人已经发布了case let x where x < 0:这里是someVarInt的替代scheme。

 switch someVar{ case Int.min...0: // do something case 0: // do something default: // do something } 

这里有一个替代的地方someVar是一个Double

 case -(Double.infinity)...0: // do something // etc 

这是如何使用范围

 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" } 

使用Swift 4,你可以select下面的开关之一来replace你的if语句。


#1使用开关与CountablePartialRangeFromPartialRangeUpTo

 let value = 1 switch value { case 1...: print("greater than zero") case 0: print("zero") case ..<0: print("less than zero") default: fatalError() } 

#2使用开关与CountableClosedRangeCountableRangeIntmax静态属性和Intmin静态属性

 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() } 

#3在where子句中使用switch

 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() } 

#4使用开关where子句和赋值_

 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() } 

#5使用带RangeExpression协议的开关~=(_:_:)运算符

 let value = 1 switch true { case 1... ~= value: print("greater than zero") case ..<0 ~= value: print("less than zero") default: print("zero") } 

#6使用带有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() } 

#7使用开关与CountablePartialRangeFromPartialRangeUpToRangeExpressioncontains(_:)方法

 let value = 1 switch true { case (1...).contains(value): print("greater than zero") case (..<0).contains(value): print("less than zero") default: print("zero") } 

<0expression式不工作(再?)所以我结束了这个:

Swift 3.0:

 switch someVar { case 0: // it's zero case 0 ..< .greatestFiniteMagnitude: // it's greater than zero default: // it's less than zero } 

很高兴Swift 4解决了这个问题:作为一个解决方法3我做了:

 switch translation.x { case 0..<200: print(translation.x, slideLimit) case -200..<0: print(translation.x, slideLimit) default: break } 

作品,但不理想