我已经使用var
关键字设置了一个可变数组。但是,当尝试使用for
循环并修改数组中的每个字符串时,出现编译错误,指出我不能对不可变值使用变异成员。可以修改数组元素似乎是合乎逻辑的,因为我使用了var
关键字。这是如何变成一成不变的?另外,我正在学习数据结构。因此,我可以扩展迭代器协议并使for
循环可变吗?
var temples = ["blue", "red", "green", "red"]
for index in temples {
//print(element.uppercased())
//print(element)
index.append(" triangles")
}
答案 0 :(得分:2)
由于index
是for循环内的let
值,因此您不能将.append
与它一起使用,而是需要
for (ind,value) in temples.enumerated() {
temples[ind] = "\(value) triangles" // +=
}
答案 1 :(得分:1)
您的项是不可变的,因为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
循环:
这也可以使用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
来替换数组中的变量而不是进行突变的方法。数组中的值。