2017-09-02 60 views
0

我知道斯威夫特我可以做一个简单的斯威夫特switch语句来计算的值的单变量比较:斯威夫特4 switch语句比较多个值,使用大于或小于

let distanceTravelled = -145.1 
switch distanceTravelled { 
case _ where distanceTravelled < 15: 
    print("You travelled the right distance") 
default: 
    print("Sad face") 
} 

但我想成为可以设置使用元组,像这样比较的矩阵:

let distanceTravelled = -145.1, 
    origin = 2 

switch (origin, distanceTravelled) { 
case (2, _ where distanceTravelled < 15): 
    print("You travelled the right distance") 
default: 
    print("Sad face") 
} 

但是,这并不编译,抱怨expected ',' separatorexpected expression in list of expressions

很明显,这在语法上是不正确的,但它不应该工作,因为这有效?

switch (2, -145.1) { 
case (2, _): 
    print("You travelled the right distance") 
default: 
    print("Sad face") 
} 

回答

2

啊哈!找到好的答案'Swift docs。根据条件是一个元组,我没有想到这一点。

switch (origin, distanceTravelled) { 
case let (_, d) where d < 15: 
    print("You travelled the right distance") 
default: 
    print("Sad face") 
} 

对于我的实际使用情况,这让有点怪异,因为我比较了enum属性出身,但它的工作:

let absOriginDistanceFromDefault = abs(defaultDividerPosition - viewDividerOrigin) 

switch (splitViewOrigin, distanceTravelled) { 
case let (.defaultPosition, d) where d < -100: 
    return .shouldMoveToTopView 
case let (.defaultPosition, d) where d > 100: 
    return .shouldMoveToBottomView 
case (.topView, _) where currentDividerPosition - defaultDividerPosition < -100: 
    return .shouldMoveToBottomView 
case (.topView, _) where abs(distanceTravelled) > absOriginDistanceFromDefault * 0.5 && currentDividerPosition < self.view.bounds.height: 
    return .shouldMoveToDefaultPosition 
case (.bottomView, _) where currentDividerPosition - defaultDividerPosition > 100: 
    return .shouldMoveToTopView 
case (.bottomView, _) where abs(distanceTravelled) > absOriginDistanceFromDefault * 0.3 && currentDividerPosition > 0: 
    return .shouldMoveToDefaultPosition 
default: 
    return .shouldReturnToOrigin 
} 

而且奇怪的是,在进一步简化它,它事实证明,我甚至不需要在前两次检查中声明变量:

let absOriginDistanceFromDefault = abs(defaultDividerPosition - viewDividerOrigin) 

switch (splitViewOrigin, distanceTravelled) { 
case (.defaultPosition, _) where distanceTravelled < -100, 
    (.bottomView, _) where currentDividerPosition - defaultDividerPosition > 100: 
    return .shouldMoveToTopView 
case (.defaultPosition, _) where distanceTravelled > 100, 
    (.topView, _) where currentDividerPosition - defaultDividerPosition < -100: 
    return .shouldMoveToBottomView 
case (.topView, _) where abs(distanceTravelled) > absOriginDistanceFromDefault * 0.5 && currentDividerPosition < maxHeight, 
    (.bottomView, _) where abs(distanceTravelled) > absOriginDistanceFromDefault * 0.3 && currentDividerPosition > 0: 
    return .shouldMoveToDefaultPosition 
default: 
    return .shouldReturnToOrigin 
}