小于或大于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: ... }
但是现在你必须定义新的isNegative
和isPositive
函数。 除非你超载一些更多的操作员…
你可以重载正常的中缀运算符来作为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:
这里是someVar
是Int
的替代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使用开关与CountablePartialRangeFrom
和PartialRangeUpTo
let value = 1 switch value { case 1...: print("greater than zero") case 0: print("zero") case ..<0: print("less than zero") default: fatalError() }
#2使用开关与CountableClosedRange
, CountableRange
, Int
的max
静态属性和Int
的min
静态属性
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使用开关与CountablePartialRangeFrom
, PartialRangeUpTo
和RangeExpression
的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
expression式不工作(再?)所以我结束了这个:
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 }
作品,但不理想