我使用var关键字设置了一个可变数组。但是,当尝试使用for循环并修改数组中的每个字符串时,我会得到一个编译错误,说明我不能对不可变值使用变异成员。我可以修改数组元素似乎是合乎逻辑的,因为我使用了var关键字。这怎么变得一成不变的?另外,我正在学习数据结构。那么,我是否可以扩展迭代器协议,并使for循环可变?
var temples = ["blue", "red", "green", "red"]
for index in temples {
//print(element.uppercased())
//print(element)
index.append(" triangles")
}发布于 2018-08-24 23:38:18
由于index是for循环中的let值,所以不能在其中使用.append,而是需要
for (ind,value) in temples.enumerated() {
temples[ind] = "\(value) triangles" // +=
}发布于 2018-08-25 03:16:43
您的项是不可变的,因为String是struct而不是对象,for-in循环将值视为let。如果您使用了NSMutableString,它是一个可变的对象(class的实例),这是可行的:
var temples: [NSMutableString] = ["blue", "red", "green", "red"]
for str in temples {
str.append(" triangles")
}
print(temples)蓝色三角形,红色三角形,绿色三角形,红色三角形
但那不是纯粹的斯威夫特。
即使通过将var添加到for循环使这些值变为可变的:
var temples = ["blue", "red", "green", "red"]
for var str in temples {
str.append(" triangles")
print(str)
}
print(temples)蓝色三角形红色三角形绿色三角形红色三角形“蓝色”、“红色”、“绿色”、“红色”
它不起作用,因为str是数组中项的副本,而不是对数组中对象的引用,因为String是struct,因此修改str不会更改数组值。
你是怎么在斯威夫特做这个的?
以下是三种方法:
1.遍历数组索引并修改适当的项:
循环遍历数组的indices,并使用该索引直接修改数组中的项:
var temples = ["blue", "red", "green", "red"]
for index in temples.indices {
temples[index].append(" triangles") // or temples[index] += " triangles"
}
print(temples)“蓝色三角形”、“红色三角形”、“绿色三角形”、“红色三角形”
使用forEach for 而不是for循环:
这也可以使用forEach来完成。
temples.indices.forEach { temples[$0].append(" triangles") }map**:** 3.在中使用一种功能方法
一种实用的方法是使用带有级联的map:
temples = temples.map { $0 + " triangles" }或String插值:
temples = temples.map { "\($0) triangles" }@Sh_Khan in his answer展示了一种使用enumerated和字符串插值来创建新的Strings的方法,以取代数组中的String,而不是修改数组中的值。
https://stackoverflow.com/questions/52012767
复制相似问题