Могу ли я в Swift использовать перечисление for-in для инициализации или сброса массива?

В настоящее время у меня есть массив в классе Swift типа Bool, объявленный следующим образом:

public var cardIsTaken: [Bool]

Чтобы не отставать от руководства по стилю Swift, которое призывает по возможности избегать индексированных циклов for, у меня есть что-то вроде этого:

for takenFlag in cardIsTaken {
    takenFlag = true
}

.. что дает мне сообщение об ошибке «невозможно назначить значение let 'takenFlag'»

Из любопытства я попытался объявить это с помощью «var», например:

    for var takenFlag in cardIsTaken {
        takenFlag = true
    }

.. который просто дает мне целую кучу разных, не связанных между собой сообщений об ошибках.

Я на 99% уверен, что в настоящее время это означает, что я не могу использовать «for foo in array» для перебора массива, если я хочу изменить каждое значение, но если есть способ сделать это, я был бы во всеуслышание.


person Charles    schedule 04.03.2015    source источник
comment
Правильно, переменная итерации считается константой (эквивалентно определению с использованием let)   -  person aruisdante    schedule 04.03.2015
comment
Вероятно, это к лучшему, что это так, половина причины, по которой я перехожу с C++ на Swift, заключается в том, что я плохой программист, которому нужна эта высокоуровневая поддержка: D, хотя спасибо!   -  person Charles    schedule 04.03.2015
comment
Обратите внимание, что поскольку значение, содержащееся в массиве, является типом значения, цикл foreach присваивает копию элемента переменной takenFlag, поэтому даже если вы можете изменить ее, это не повлияет массив, только копия. Помните об этом, когда имеете дело с типами значений.   -  person Antonio    schedule 04.03.2015
comment
Итак, @aruisdante и Антонио, возможно ли переназначить переменную итерации внутри цикла for-in? Признание необходимости определения цикла с помощью var. Хорошо, если он присваивает копию элемента переменной, но можно ли ее использовать для замены элемента в массиве?   -  person jungledev    schedule 04.03.2016


Ответы (1)


Лучший способ сделать это — использовать встроенную в массив функцию сопоставления.

cardIsTaken = cardIsTaken.map { isTaken in true }
person kellanburket    schedule 04.03.2015
comment
Теперь это решение, достойное Swift! - person Charles; 04.03.2015
comment
Обратите внимание, что все методы массива высокого порядка (map, filter и reduce) создают новые массивы, а не изменяют существующий на месте. Это важно знать, если вы полагались на побочные эффекты от изменения существующего массива, а не от создания нового. - person aruisdante; 04.03.2015