2016-09-05 8 views
2

Es gibt 2 verschiedene verschachtelte Schleifen und jeder von ihnen hat eine break-Anweisung, um die äußere Schleife unter ihren bestimmten Bedingungen zu unterbrechen.Unterschiedliche Steuerflussanweisung kann denselben Titel haben

Ich frage mich, ob ich die 2 äußeren Schleifen mit dem gleichen Titel markieren, würde dies eine Verwirrung für die Break-Anweisung auslösen?

Ich habe dann versucht der folgende Code

//#1 
outterLoop: for x in 1...3 { 
    innerLoop: for y in 1...3 { 
     if x == 3 { 
      break outterLoop //break the "outterLoop" 
     } else { 
      print("x: \(x), y: \(y)") 
     } 
    } 
} 

//#2 
outterLoop: for a in 1...3 { 
    innerLoop: for b in 1...3 { 
     if b == 3 { 
      break outterLoop //break the "outterLoop" 
     } else { 
      print("a: \(a), b: \(b)") 
     } 
    } 
} 

Schnipsel Es stellt sich heraus, funktioniert der Code nur in Ordnung, und es gibt keine erneute Erklärung Ausgabe erscheint. Ich denke, es könnte mit dem Thema Bereich zusammenhängen. Die erstePause nur siehe outterLoop im # 1 Codeblock und die zweitePause kann nur die outterLoop am Umfang es sich befindet, AKA sehen, die # 2 Codeblock. Als Ergebnis beschränkt der unsichtbare Bereich die Variable, die der innere Bruch "sehen" kann.

Frage: Bin ich es richtig verstanden? Wenn nicht, bitte korrigieren Sie mich. Und selbst wenn ich mich nicht irrte, glaube ich, dass ich informelle und ungenaue Beschreibungen verwendet habe. Wäre schön, wenn Sie mir eine formellere und genauere Beschreibung geben könnten.

Vielen Dank

Antwort

1

„Der Umfang einer markierten Anweisung ist die gesamte Anweisung nach dem Statement-Label. Sie können beschriftete Anweisungen verschachteln, aber der Name jeder Anweisungsbeschriftung muss eindeutig sein. "

Auszug aus: Apple Inc." Die Swift-Programmiersprache (Swift 2.2). "IBooks. https://itun.es/de/jEUH0.l

Der Umfang des ersten outterLoop: Etiketts ist die erste for-Schleife, und der Umfang des zweiten outterLoop: Etiketts ist die zweite for-Schleife.

Daher break outterLoop innerhalb der ersten Schleife nur mit dem ersten outterLoop: Etikett, und das gleiche gilt für die zweite Schleife beziehen kann.

Dies unterscheidet sich von C, in dem die Anweisung goto und seine Zieletikett nur in der gleichen Funktion sein müssen und folglich keine zwei Etiketten mit dem gleichen Namen können innerhalb der gleichen Funktion definiert werden.

1

Sie haben Recht, der Umfang des Etiketts beschränkt sich auf die Angabe, die es beschriftet. Aus der Swift 2.2-Sprachreferenz:

Der Bereich einer beschrifteten Anweisung ist die gesamte Anweisung, die auf die Anweisung folgt. Sie können beschriftete Anweisungen verschachteln, aber der Name jedes Anweisungslabels muss eindeutig sein.

Das macht intuitiv Sinn, da kann man nur Schleifen-Label, if Aussagen und switch Aussagen, und die einzige Verwendung des Etiketts aus dieser Aussage zu brechen ist, oder mit der nächsten Iteration davon fortzusetzen. Es wäre also nicht sinnvoll, wenn ein Label außerhalb der von ihm beschrifteten Anweisung sichtbar wäre.

Verwandte Themen