有两个不同的嵌套循环,每个循环都有一个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 。因此,隐形范围限制了内部中断可以“看到”的变量
问题:我明白这是对的吗?如果没有,请纠正我。即使我没有错,我相信我使用了非正式和不精确的描述。如果你能给我一个更正式和更准确的描述,那就太好了。
非常感谢
答案 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
语句,并且标签的唯一用途是打破该语句,或继续使用下一次迭代。因此,标签在其标注的语句之外可见是没有用的。