Я хочу перечислить массив в Swift и удалить определенные элементы. Мне интересно, безопасно ли это делать, а если нет, то как я должен это достичь.Удаление из массива во время перечисления в Swift?
В настоящее время, я бы это сделать:
for (index, aString: String) in enumerate(array) {
//Some of the strings...
array.removeAtIndex(index)
}
Это неверно для Swift. Массивы являются ** значениями ** типов, поэтому они «копируются», когда они передаются в функции, присваиваются переменным или используются в перечислении. (Swift реализует функцию копирования на запись для типов значений, поэтому фактическое копирование сведено к минимуму.) Попробуйте выполнить следующее: var x = [1, 2, 3, 4, 5]; печать (х); var i = 0; для v в x {if (v% 2 == 0) {x.remove (at: i)} else {i + = 1}}; print (x) – 404compilernotfound
Да, вы правы, при условии, что вы точно знаете, что делаете. Возможно, я не смог четко выразить свой ответ. Я должен был сказать * Это возможно, но это небезопасно *. Это небезопасно, потому что вы мутируете размер контейнера, и если вы ошибаетесь в своем коде, ваше приложение выйдет из строя. Swift все о написании безопасного кода, который не будет неожиданно разбиваться во время выполнения. Вот почему использование функциональных функций программирования, таких как 'filter', является _safer_. Вот мой немой пример: 'var y = [1, 2, 3, 4, 5]; print (y); для (индекс, значение) в y.enumerated() { y.remove (at: index) } print (y) ' – Starscream
Я просто хотел бы выделить, что можно изменить список, который перечисляется в Swift, так как в отличие от поведения, генерирующего исключения, при повторении через NSArray с быстрым перечислением или даже с типами коллекции C#. Это не модификация, которая могла бы вызвать здесь исключение, но возможность расходовать индексы и выйти за пределы (потому что они уменьшили размер). Но я определенно согласен с вами в том, что обычно безопаснее и яснее использовать тип функционального программирования для управления коллекциями. Особенно в Свифт. – 404compilernotfound