Нельзя использовать мутирующий член при ошибке неизменного значения при добавлении строки в цикл for - PullRequest
0 голосов
/ 25 августа 2018

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

var temples = ["blue", "red", "green", "red"]

for index in temples {
    //print(element.uppercased())
    //print(element)
    index.append(" triangles")
}

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Ваши элементы неизменны, потому что String является struct, а не объектом, а цикл for-in обрабатывает значение как let.Это сработало бы, если бы вы использовали NSMutableString, который является изменяемым объектом (экземпляр class):

var temples: [NSMutableString] = ["blue", "red", "green", "red"]

for str in temples {
    str.append(" triangles")
}

print(temples)
[blue triangles, red triangles, green triangles, red triangles]

, но это не чистый Swift.


Даже если вы сделали значения изменяемыми, добавив var в цикл for:

var temples = ["blue", "red", "green", "red"]

for var str in temples {
    str.append(" triangles")
    print(str)
}

print(temples)
blue triangles
red triangles
green triangles
red triangles
["blue", "red", "green", "red"]

Это не 'Это не работает, потому что str является копией элемента в массиве, а не ссылкой на объект в массиве, потому что String является struct, поэтому изменение str не изменит значения массива.


Итак, как вы делаете это в Swift?

Вот 3 способа:

1.Цикл по индексам массива и изменение элементов на месте:

Цикл по indices массива и использование этого индекса для изменения элементов непосредственно в массиве:

var temples = ["blue", "red", "green", "red"]

for index in temples.indices {
    temples[index].append(" triangles") // or temples[index] += " triangles"
}

print(temples)
["blue triangles", "red triangles", "green triangles", "red triangles"]

2.Используйте forEach вместо for loop:

Это также можно сделать с помощью forEach:

temples.indices.forEach { temples[$0].append(" triangles") }

3.Используйте функциональный подход с map:

Функциональным способом будет использование map с конкатенацией:

temples = temples.map { $0 + " triangles" }

или String интерполяция:

temples = temples.map { "\($0) triangles" }

@ Sh_Khan в его ответ показывает способ использования enumerated и Строковая интерполяция для создания новых String s для замены единиц в массивевместо изменения значений в массиве.

0 голосов
/ 25 августа 2018

Поскольку index является значением let внутри цикла for, вы не можете использовать .append с ним, вместо этого вам нужно

for (ind,value) in temples.enumerated()  {
  temples[ind] = "\(value) triangles" // +=
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...