фур петля ведет себя странно - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть код ниже.

var myArray : [String] = ["1", "2", "3", "4", "5"]
for var i in 0..<myArray.count {
    print("i==\(i)==\(myArray[i])")
    myArray.remove(at: i)
    i = i-1
}

Журнал такой же, как показано ниже.

i==0==1
i==1==3
i==2==5
fatal error: Index out of range

Журнал, который я ожидал,

i==0==1
i==0==2
i==0==3
i==0==4
i==0==5

Я говорю это, потому чтокогда я устанавливаю i=i-1 в цикле for, i всегда будет 0.

Это означает, что переменная i не имеет эффекта кода i=i-1

Любая идея, почему это


Тот же код, который у меня есть в Java, и он отлично работает.

ArrayList<String> mm = new ArrayList<>();
mm.add("1");
mm.add("2");
mm.add("3");
mm.add("4");
mm.add("5");

for(int i=0; i<mm.size(); i++){

    Log.d("mm", "i=="+i+"=="+mm.get(i));

    mm.remove(i);

    i = i-1;

}

Журнал у меня, как показано ниже

i==0==1
i==0==2
i==0==3
i==0==4
i==0==5

1 Ответ

0 голосов
/ 04 декабря 2018

Свифт для циклов работает немного иначе, чем вы думаете.

Прежде всего обратите внимание, что бит после in оценивается только один раз.Он не получает счетчик массива в каждой итерации.0..<array.count может быть полностью заменено на 0..<5, и результат не будет отличаться.

Во-вторых, даже если вы установите i в цикле, значение i не будетзначение, которое вы установите в следующей итерации.Это связано с тем, что в начале каждой итерации i назначается следующий элемент в последовательности.Это означает, что независимо от того, что вы присваиваете i, i будет хранить это значение только до конца текущей итерации.

Теперь мы можем объяснить вывод.

Первая итерация,i равно 0, поэтому элемент с индексом 0 печатается.1-й элемент удален.Массив теперь ["2", "3", "4", "5"].

Вторая итерация, i равно 1, поэтому печатается элемент с индексом 1 (3).2-й элемент удален.Массив теперь ["2", "4", "5"].

Третья итерация, i равно 2, поэтому печатается элемент с индексом 2 (5).3-й элемент удален.Массив теперь ["2", "4"].

Четвертая итерация, i равна 3, но длина массива составляет всего 2 элемента, поэтому индекс выходит за пределы диапазона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...