2015-04-03 81 views
2

让我们说,我们有以下的伪代码片段:Swift语言中的switch语句,case子句中的执行顺序是什么?

switch some_variable { 
    case let v where <condition_checking>: 
     do_something... 
} 

据我了解,当代码执行进入交换机时,它首先与第一个case语句去(我们只有一个)。然后它检查condition_checking部分,如果它是真的,那么let部分将被执行并且do_something将有机会运行。那是对的吗?

我问这个问题,是因为我看到了下面的代码片段从苹果公司的文件https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ControlFlow.html(页面的最后部分):

let finalSquare = 25 
var board = [Int](count: finalSquare + 1, repeatedValue: 0) 
board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02 
board[14] = -10; board[19] = -11; board[22] = -02; board[24] = -08 
var square = 0 
var diceRoll = 0 

gameLoop: while square != finalSquare { 
    if ++diceRoll == 7 { diceRoll = 1 } 
    switch square + diceRoll { 
    case finalSquare: 
     // diceRoll will move us to the final square, so the game is over 
     break gameLoop 
    case let newSquare where newSquare > finalSquare: 
     // diceRoll will move us beyond the final square, so roll again 
     continue gameLoop 
    default: 
     // this is a valid move, so find out its effect 
     square += diceRoll 
     square += board[square] 
    } 
} 
println("Game over!") 

注意这一说法case let newSquare where newSquare > finalSquare:,在newSquarelet在此case语句中定义。 where直接使用newSquare,看起来let部分是第一次执行,然后是where部分。这不是我所了解的。任何人都可以帮助澄清吗?

回答

3

据我了解,当代码执行进入交换机时,它首先与第一个case语句去(我们只有一个)。然后它检查condition_checking部分,如果它是真的,那么let部分将被执行并且do_something将有机会运行。那是对的吗?

我想你误会了。在此代码:

case let newSquare where newSquare > finalSquare: 

执行顺序是:

  • 绑定newSquare到的square + diceRoll值。
  • 评估newSquare > finalSquare
  • 如果为真,与newSquare结合

此行执行块:

case finalSquare: 

可以被认为是作为简写:

case let __temp where __temp == finalSquare: 

(不创建一个真实的__temp符号)

+0

谢谢。非常清楚地解释。令人困惑的是模式匹配部分只是创建一个变量。我现在很清楚。再次感谢! – 2015-04-03 18:48:33

3

首先,代码将匹配expression与案例pattern。在这种情况下,它将是let newSquare它将执行where条件,该条件被称为guard表达式。

因此,将代码视为匹配案例模式,然后再使用where条件进行验证。

第一个:匹配案例模式let newSquare,它将值简单地分配给变量newSquare。

第二:检查guard表达newSquare > finalSquare

开关情况下,可以任选地含有各 图案之后的保护表达。关键字引入了一个警戒表达式,其中 后跟一个表达式,用于在案例中的某个模式被认为与 控制表达式匹配之前提供附加的 条件。如果存在警戒表达式,则只有在控件 表达式的值与案例模式之一匹配并且警卫 表达式计算结果为true时,才会执行相关案例中的语句 。

文档: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Statements.html

+0

谢谢。 “提供**附加**条件”表示它在模式匹配后被评估。令人困惑的是模式匹配部分只是创建一个变量。哈哈我现在很清楚。再次感谢! – 2015-04-03 18:47:41

+0

是的,模式匹配只是简单地分配一个变量是有点令人困惑,但他们这样做是为了始终匹配这种情况(如果第一种情况不符合),然后检查“guard”where子句。这样,如果它与where子句不匹配,它将在匹配案例模式时失败并落入默认情况。 – chrissukhram 2015-04-03 20:08:10