在for循环中附加到字符串时,无法在不可变值错误时使用变异成员

时间:2018-08-24 23:19:40

标签: swift

我已经使用var关键字设置了一个可变数组。但是,当尝试使用for循环并修改数组中的每个字符串时,出现编译错误,指出我不能对不可变值使用变异成员。可以修改数组元素似乎是合乎逻辑的,因为我使用了var关键字。这是如何变成一成不变的?另外,我正在学习数据结构。因此,我可以扩展迭代器协议并使for循环可变吗?

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

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

2 个答案:

答案 0 :(得分:2)

由于index是for循环内的let值,因此您不能将.append与它一起使用,而是需要

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

答案 1 :(得分:1)

您的项是不可变的,因为Stringstruct而不是对象,并且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是数组中项目的副本,而不是对数组中对象的引用,因为Stringstruct,因此请修改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循环:

这也可以使用forEach完成:

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

3。对map使用功能性方法:

一种实用的方法是将map与串联一起使用:

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

String插值:

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

his answer中的

@Sh_Khan显示了一种使用enumerated字符串插值来创建新的String来替换数组中的变量而不是进行突变的方法。数组中的值。