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

时间:2016-09-05 17:10:10

标签: swift scope flow-control

有两个不同的嵌套循环,每个循环都有一个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 em> 中断只能在其所在的范围,AKA,#2 代码块中看到 outterLoop 。因此,隐形范围限制了内部中断可以“看到”的变量

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

非常感谢

2 个答案:

答案 0 :(得分:1)

  

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

     

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

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

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

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

答案 1 :(得分:1)

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

  

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

这具有直观意义,因为您只能标记循环,if语句和switch语句,并且标签的唯一用途是打破该语句,或继续使用下一次迭代。因此,标签在其标注的语句之外可见是没有用的。