我看到了差异,但我不明白(我不知道如何在理解代码的情况下阅读代码)
var abc = ["A", "B", "C", "D"]
var number = ["1", "2", "3"]
for i in 0 ..< abc.count {
var str = "\(abc[i])"
for _ in 0..<2{
str += " \(number[i])"
}
print(str)
} /* output: A11
B22
C33
Fatal error: Index out of range: file Swift/ContiguousArrayBuffer.swift, line 444
*/
Run Code Online (Sandbox Code Playgroud)
当代码在嵌套的 for 循环中有 'i' 而不是 '_' 时:
var abc = ["A","B","C","D"]
var number = ["1","2","3"]
for i in 0..<abc.count {
var str = "\(abc[i])"
for i in 0..<2{
str += " \(number[i])"
}
print(str)
}
/* output: A 1 2
B 1 2
C 1 2
D 1 2
*/
Run Code Online (Sandbox Code Playgroud)
下划线(在这种情况下)告诉编译器那里有东西,但您不需要在代码中按名称访问它。在您的问题的评论中有一个包含更多详细信息的链接,但让我们看看它对相关代码的影响。
查看格式化的代码可能有助于更清晰:
var abc = ["A", "B", "C", "D"]
var number = ["1", "2", "3"]
for i in 0 ..< abc.count {
var str = "\(abc[i])"
for _ in 0..<2 {
str += " \(number[i])"
}
print(str)
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,外for循环将其索引存储在 中I。内部 for 循环有一个索引,但_基本上是在说(我现在可以忽略它)。循环仍在运行,但索引并未在任何地方使用。
这导致运行时错误的原因是abc元素比number. 因此,当内部循环尝试访问number[3]when iis 时3,就会发生崩溃。
现在,让我们看第二个例子:
var abc = ["A","B","C","D"]
var number = ["1","2","3"]
for i in 0..<abc.count {
var str = "\(abc[i])"
for i in 0..<2 {
str += " \(number[i])"
}
print(str)
}
Run Code Online (Sandbox Code Playgroud)
在本例中,i用于外循环和内循环。这有时被称为变量阴影,通常是一个坏主意,因为它会导致非常混乱的情况,很容易弄错正在读取的变量。例如,在这里,在外循环的范围内,i意味着一件事,但在内循环的范围内,它意味着另一件事。
像这样会更清楚:
for i in 0..<abc.count {
var str = "\(abc[i])"
for j in 0..<2 {
str += " \(number[j])"
}
print(str)
}
Run Code Online (Sandbox Code Playgroud)
现在,在外循环上i是索引,而在内循环上j是索引。
这两个示例可能看起来非常相似,但实际上它们的功能非常不同,因为在循环中如何使用索引的细节。
| 归档时间: |
|
| 查看次数: |
109 次 |
| 最近记录: |