2

ネストされた 2 つの異なるループがあり、それぞれに特定の条件下で外側のループを中断する break ステートメントがあります。

外側の 2 つのループに同じタイトルを付けると、break ステートメントの混乱を招くのではないでしょうか?

次に、次のコードスニペットを試しました

//#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)")
        }
    }
}

コードは問題なく動作し、再宣言の問題は発生していません。スコープのトピックに関連している可能性があると思います。最初の ブレーク#1コード ブロックのoutterLoopのみを確認でき、 2 番目のブレークでは、 outterLoopが配置されたスコープ (別名#2コード ブロック) でのみ outterLoop を確認できます。その結果、非表示のスコープにより、内側のブレークが「見る」ことができる変数が制限されました。

質問: 私はそれが正しいと理解していますか? そうでない場合は、私を修正してください。たとえ私が間違っていなかったとしても、私は非公式で不正確な説明を使用したと信じています. より正式で正確な説明をいただければ幸いです。

どうもありがとう

4

2 に答える 2

1

「ラベル付きステートメントの範囲は、ステートメント ラベルに続くステートメント全体です。ラベル付きステートメントをネストできますが、各ステートメント ラベルの名前は一意である必要があります。」</p>

抜粋: Apple Inc.「The Swift Programming Language (Swift 2.2)」。アイブック。https://itun.es/de/jEUH0.l

最初のラベルのスコープはoutterLoop:最初の for ループであり、2 番目のoutterLoop:ラベルのスコープは 2 番目の for ループです。

したがってbreak outterLoop、最初のループ内では最初のoutterLoop:ラベルのみを参照でき、2 番目のループについても同じことが言えます。

これは、ステートメントとそのターゲット ラベルが同じ関数内にあるだけでよい C とは異なりgotoます。したがって、同じ名前の 2 つのラベルを同じ関数内で定義することはできません。

于 2016-09-05T17:28:08.687 に答える
1

正解です。ラベルの範囲は、ラベルが付けられたステートメントに限定されます。Swift 2.2 言語リファレンスから:

ラベル付きステートメントの有効範囲は、ステートメント ラベルに続くステートメント全体です。ラベル付きステートメントをネストできますが、各ステートメント ラベルの名前は一意である必要があります。

ifループ、ステートメント、およびswitchステートメントにのみラベルを付けることができ、ラベルの唯一の用途はそのステートメントから抜け出すか、次の反復を続行することであるため、これは直感的に理にかなっています。したがって、ラベルがラベル付けされたステートメントの外に表示されることは役に立ちません。

于 2016-09-05T17:29:27.313 に答える