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")!
    ...
}