更新数组中的元素

时间:2018-03-27 09:13:16

标签: swift higher-order-functions

我们如何更新数组的元素

方法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只是方式?

2 个答案:

答案 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" } }