Ваши элементы неизменны, потому что 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 для замены единиц в массивевместо изменения значений в массиве.