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

事实证明代码工作得很好,并且没有出现重新声明问题。我认为这可能与范围主题有关。第一个 break只能看到#1代码块中的outterLoop ,第二个break只能在它所在的范围内看到outterLoop ,也就是#2代码块。结果,不可见的作用域限制了内部break可以“看到”的变量

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

非常感谢

4

2 回答 2

1

“带标签的语句的范围是语句标签之后的整个语句。可以嵌套带标签的语句,但每个语句标签的名称必须是唯一的。”</p>

摘自:Apple Inc. “Swift 编程语言 (Swift 2.2)。” 电子书。https://itun.es/de/jEUH0.l

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

所以break outterLoop第一个循环里面只能引用第一个outterLoop:标签,第二个循环也是如此。

这与 C 中的goto语句及其目标标签只需要在同一个函数中不同,因此不能在同一个函数中定义两个具有相同名称的标签。

于 2016-09-05T17:28:08.687 回答
1

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

带标签的语句的范围是语句标签之后的整个语句。您可以嵌套带标签的语句,但每个语句标签的名称必须是唯一的。

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

于 2016-09-05T17:29:27.313 回答