我们如何更新数组的元素
方法1: - 工作代码: -
var numberWords = ["one", "two", "three"]
for i in 0..<numberWords.count {
if numberWords[i] == "two" {
numberWords[i] = "2"
}
}
但我正在寻找使用Swift高阶函数的解决方案
方法2:
numberWords = numberWords.filter {
if $0 == "one" {
$0 = "1"//cannot assign value $0 is immutable
}
return true
}
抛出错误:无法赋值$ 0是不可变的
是否可行或方法1只是方式?
答案 0 :(得分:7)
不要使用filter()
,它没有意义
过滤点是迭代每个元素,并根据你的意愿告诉你是否保留它(返回true)(返回false)。
相反,请使用map()
:
numberWords = numberWords.map({ return $0 == "one" ? "1" : $0 })
我使用了三元if并明确写了一个&#34; return&#34; (这是没有必要的,因为它已经完成了#34;内部&#34;(你需要返回一些东西)),但你可以更明确地保留你以前的代码:
numberWords = numberWords.map({
if $0 == "one" {
return "1"
}
return $0 })
map()
更适合这种情况。如果你想迭代每个项目并在需要时修改它,你就可以使用它。这就是你想要做的事情。
答案 1 :(得分:2)
就像一点点变化一样,你可以编写一个就地贴图,这对大型数组来说可能更有效(另见reduce(into:))。
extension Array
{
mutating func mapInPlace(transform: (inout Element) -> Void)
{
for i in 0 ..< self.count
{
transform(&self[i])
}
}
}
var a = ["one", "two", "three"]
a.mapInPlace{ if $0 == "two" { $0 = "2" } }