不同的控制流语句可以有相同的标题

Different control flow statement can have the same title

有 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)")
        }
    }
}

事实证明代码工作正常,没有出现 re-declaration 问题。我认为这可能与范围主题有关。 first break只能看到#1[=32中的outterLoop =] 代码块和 second break 只能在它所在的范围内看到 outterLoop,AKA , #2 代码块。结果,invisible scope限制了inner break可以的变量"see"

问:我理解的对吗?如果不是,请纠正我。即使我没有错,我相信我使用了非正式和不精确的描述。如果您能给我一个更正式和准确的描述,那就太好了。

非常感谢

“The scope of a labeled statement is the entire statement following the statement label. You can nest labeled statements, but the name of each statement label must be unique.”

Excerpt From: Apple Inc. “The Swift Programming Language (Swift 2.2).” iBooks. https://itun.es/de/jEUH0.l

第一个outterLoop:标签的范围是第一个for循环, 第二个 outterLoop: 标签的范围是第二个 for循环。

因此第一个循环里面的break outterLoop只能引用 到第一个 outterLoop: 标签,同样适用于 第二个循环。

这与 C 不同,其中 goto 语句及其目标标签 只需要在同一个函数中,因此不需要两个 可以在同一个函数中定义同名标签。

你是对的,标签的范围仅限于它所标签的语句。来自 Swift 2.2 语言参考:

The scope of a labeled statement is the entire statement following the statement label. You can nest labeled statements, but the name of each statement label must be unique.

这很直观,因为您只能标记循环、if 语句和 switch 语句,并且标签的唯一用途是跳出该语句或继续与它的下一次迭代。因此,标签在其标记的语句之外可见是没有用的。