具有相同索引名称的嵌套循环

时间:2016-12-22 22:22:03

标签: swift

在下面的嵌套循环中:

for i in 0..<2 {
    print(i)
    for i in 0..<2 {
        print(i)
    }
}

输出应为:

0 0

1

然而它产生:

0 0

1
1
0
1
我无法在苹果文档中找到任何涉及索引(i)范围的内容。如果官方消息来源提供任何参考或解释,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

定义循环for X in ...时,您需要定义每次迭代期间存在的范围以及该范围中存在的常量。除了do {}的情况之外,我无法找到范围的明确文档,但文档确实假设在讨论诸如guard声明之类的事情时,在循环中创建和销毁范围。实际上,这就是单循环中i的范围。

// Scope that i doesn't exist in.

for i in 1..<2 {
    // Scope that i exists in.
}

// Scope that i doesn't exist in.

定义嵌套范围(内部for循环)时,您可以重新定义变量和常量。这是在循环声明中定义i时发生的情况。在内部循环内部,编译器向外查看定义范围。

i的情况下,它在内循环中查找并找到它。对于print,使用的标识符,它在内部循环,外部循环,任何包含小说,然后是类,然后是模块,然后导入模块,直到它找到Swift.print

答案 1 :(得分:0)

循环变量的作用域是循环体。 Swift允许局部变量的阴影,因此嵌套循环得到一个名为&#34; i&#34;的全新变量,并且失去对变量&#34; i&#34;的访问权限。从其外部范围。