Swift 5 Thread 1: Неустранимая ошибка: индекс выходит за пределы диапазона - PullRequest
0 голосов
/ 22 марта 2020

Я перебираю массив, используя счетчик массивов. Код будет выполняться один раз, а затем после этого я получаю индекс вне диапазона ошибок. Мой код ниже. Я не могу понять, почему я получаю эту ошибку. Может кто-нибудь, пожалуйста, дайте мне знать, что мне не хватает?

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

            }}

Ответы [ 2 ]

1 голос
/ 22 марта 2020

Проблема с 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

С учетом всего вышесказанного мы вообще не будем использовать stride со значением by, равным 1. Мы просто будем использовать наполовину. оператор открытого диапазона , ..<:

for index in 0 ..< strings.count {
    print(strings[index])
}

Или, поскольку этот индекс вам на самом деле не нужен, вы просто сделаете:

for string in strings {
    print(string)
}

Или, в вашем case:

for post in posts {
    let url = URL(string: "https://api.tdameritrade.com/v1/marketdata/\(post.symbol)/quotes")!
    ...
}
0 голосов
/ 22 марта 2020

Вы использовали through вместо to.

Но нет причин использовать шаг! Повторяйте более осмысленно, и вы избежите этой проблемы лучше.

...