Swift 在for循环中向字符串追加时,无法对不可变值错误使用mutating member

Swift 在for循环中向字符串追加时,无法对不可变值错误使用mutating member,swift,Swift,我使用var关键字设置了一个可变数组。但是,当尝试对循环使用并修改数组中的每个字符串时,我会收到一个编译错误,说明我无法对不可变值使用mutating member。我可以修改我的数组元素似乎是合乎逻辑的,因为我使用了var关键字。这是如何变得一成不变的?另外,我正在学习数据结构。那么,我可以扩展迭代器协议并使for循环可变吗 var temples = ["blue", "red", "green", "red"] for index in temples { //print(ele

我使用
var
关键字设置了一个可变数组。但是,当尝试对循环使用
并修改数组中的每个字符串时,我会收到一个编译错误,说明我无法对不可变值使用mutating member。我可以修改我的数组元素似乎是合乎逻辑的,因为我使用了
var
关键字。这是如何变得一成不变的?另外,我正在学习数据结构。那么,我可以扩展迭代器协议并使
for
循环可变吗

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

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

由于
索引
是for循环中的
let
值,因此不能使用

for (ind,value) in temples.enumerated()  {
  temples[ind] = "\(value) triangles" // +=
}

您的项是不可变的,因为
String
struct
而不是对象,而
for in
循环将该值视为
let
。如果您使用了可变对象
NSMutableString
(类的实例)
),那么这将起作用:

但这并不是纯粹的斯威夫特


即使通过将
var
添加到
for
循环中使值可变:

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

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

print(temples)
它不起作用,因为
str
是数组中项的副本,而不是数组中对象的引用,因为
String
struct
,所以修改
str
不会更改数组值


那么,在Swift中,您是如何做到这一点的

这里有三种方法:

1。循环数组索引并就地修改项:

循环数组的
索引
,并使用该索引直接修改数组中的项:

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

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

print(temples)
2。使用
forEach
而不是
for
循环:

这也可以使用forEach的
实现:

temples.indices.forEach { temples[$0].append(" triangles") }
3。对
映射使用功能性方法

一种功能性方法是将
map
与连接一起使用:

temples = temples.map { $0 + " triangles" }
字符串
插值:

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


@Sh_Khan in展示了一种使用
枚举
和字符串插值创建新的
字符串
s来替换数组中的字符串,而不是改变数组中的值的方法。

并且“index”不是索引:)@DavidBerry an对vampers=D隐藏
["blue triangles", "red triangles", "green triangles", "red triangles"]
temples.indices.forEach { temples[$0].append(" triangles") }
temples = temples.map { $0 + " triangles" }
temples = temples.map { "\($0) triangles" }