Swift 5 Thread 1: Fatal error: Index out of range
Swift 5 Thread 1: Fatal error: Index out of range
我正在使用数组计数遍历数组。该代码将 运行 一次,然后我得到一个索引超出范围的错误。我的代码如下。我不知道为什么会收到此错误。有人可以让我知道我错过了什么吗?
for stockItem in stride(from: 0, through: self.posts.count, by: 1) {
guard let url = URL(string: "https://api.tdameritrade.com/v1/marketdata/\(self.posts[stockItem].symbol)/quotes") else {
print("URL does not work")
fatalError("URL does not work!")
}}
您使用了 through
而不是 to
。
但是没有理由使用步幅!更有意义地迭代,你会更好地避免这个问题。
stride(from:through:by:)
的问题在于它包含提供给 through
的最终值。考虑:
let strings = ["foo", "bar", "baz"]
for index in stride(from: 0, through: strings.count, by: 1) {
print(index)
}
这将打印 四个 个值 (!):
0
1
2
3
如果您尝试将该索引用作数组中的下标...
for index in stride(from: 0, through: strings.count, by: 1) {
print(index, strings[index])
}
... 它适用于前三个索引,但第四个索引会失败,因为数组中只有三个项目:
0 foo
1 bar
2 baz
Fatal error: Index out of range
您可以使用 to
来解决这个问题,而是逐步达到但不包括最终值:
for index in stride(from: 0, to: strings.count, by: 1) {
print(index, strings[index])
}
那将在第三个条目停止,一切都会很好:
0 foo
1 bar
2 baz
综上所述,我们通常根本不会使用 by
值为 1 的 stride
。我们只会使用 half-open range operator、..<
:
for index in 0 ..< strings.count {
print(strings[index])
}
或者,更好的是,您可以改用:
for index in strings.startIndex ..< strings.endIndex {
print(strings[index])
}
或者,更好的是,使用 indices
:
for index in strings.indices {
print(strings[index])
}
如果您碰巧正在处理数组切片,其中无法假定适当的值,或者如果您碰巧正在处理一些不会发生的随机访问集合,那么 indices
的使用就变得必不可少使用数字索引。
或者,因为你真的不需要那个索引,你可以这样做:
for string in strings {
print(string)
}
或者,在您的情况下:
for post in posts {
let url = URL(string: "https://api.tdameritrade.com/v1/marketdata/\(post.symbol)/quotes")!
...
}
我正在使用数组计数遍历数组。该代码将 运行 一次,然后我得到一个索引超出范围的错误。我的代码如下。我不知道为什么会收到此错误。有人可以让我知道我错过了什么吗?
for stockItem in stride(from: 0, through: self.posts.count, by: 1) {
guard let url = URL(string: "https://api.tdameritrade.com/v1/marketdata/\(self.posts[stockItem].symbol)/quotes") else {
print("URL does not work")
fatalError("URL does not work!")
}}
您使用了 through
而不是 to
。
但是没有理由使用步幅!更有意义地迭代,你会更好地避免这个问题。
stride(from:through:by:)
的问题在于它包含提供给 through
的最终值。考虑:
let strings = ["foo", "bar", "baz"]
for index in stride(from: 0, through: strings.count, by: 1) {
print(index)
}
这将打印 四个 个值 (!):
0
1
2
3
如果您尝试将该索引用作数组中的下标...
for index in stride(from: 0, through: strings.count, by: 1) {
print(index, strings[index])
}
... 它适用于前三个索引,但第四个索引会失败,因为数组中只有三个项目:
0 foo
1 bar
2 baz
Fatal error: Index out of range
您可以使用 to
来解决这个问题,而是逐步达到但不包括最终值:
for index in stride(from: 0, to: strings.count, by: 1) {
print(index, strings[index])
}
那将在第三个条目停止,一切都会很好:
0 foo
1 bar
2 baz
综上所述,我们通常根本不会使用 by
值为 1 的 stride
。我们只会使用 half-open range operator、..<
:
for index in 0 ..< strings.count {
print(strings[index])
}
或者,更好的是,您可以改用:
for index in strings.startIndex ..< strings.endIndex {
print(strings[index])
}
或者,更好的是,使用 indices
:
for index in strings.indices {
print(strings[index])
}
如果您碰巧正在处理数组切片,其中无法假定适当的值,或者如果您碰巧正在处理一些不会发生的随机访问集合,那么 indices
的使用就变得必不可少使用数字索引。
或者,因为你真的不需要那个索引,你可以这样做:
for string in strings {
print(string)
}
或者,在您的情况下:
for post in posts {
let url = URL(string: "https://api.tdameritrade.com/v1/marketdata/\(post.symbol)/quotes")!
...
}