映射修改Swift 2.2(3.0)中的对象数组

ker*_*nic 10 arrays swift map-function

我希望能够map在Swift中使用Swift 来修改我的对象数组,而不需要遍历每个元素.

在此之前能够做到这样的事情(这里有更多细节描述:

gnomes = gnomes.map { (var gnome: Gnome) -> Gnome in
    gnome.age = 140
    return gnome
}
Run Code Online (Sandbox Code Playgroud)

感谢Erica Sadun和其他人,新提案已经完成,我们现在正在摆脱C风格的循环并var在循环中使用.

在我的情况下,我首先得到一个警告,以删除varin然后一个错误我gnome是一个常数(自然)

我的问题是:我们如何更改一个map或新的样式循环中的数组,以便为Swift 3.0做好充分的准备?

vad*_*ian 23

如果要保留该语法,只需使用(可变)临时变量

gnomes = gnomes.map { (gnome: Gnome) -> Gnome in
  var mutableGnome = gnome
  mutableGnome.age = 140
  return mutableGnome
}
Run Code Online (Sandbox Code Playgroud)


dfr*_*fri 14

(下面Gnome是引用类型的情况;类 - 因为你没有向我们展示你如何定义Gnome.对于Gnome作为值类型(结构)的情况,请参阅@vadian:s answer)


删除var不会影响使用.map变异引用类型对象数组的可变成员.即,你可以简单地使用你的旧方法(但是,在闭包签名中省略).var.map

class Gnome {
    var age = 42
}

var gnomes = [Gnome(), Gnome(), Gnome()]

gnomes = gnomes.map {
    $0.age = 150
    return $0
}

/* result */
gnomes.forEach { print($0.age) } // 3x 150
Run Code Online (Sandbox Code Playgroud)

但是,如果您只想修改原始数组而不是将结果分配给.map新数组,则.forEach可能是比较合适的选择.map.

gnomes.forEach { $0.age = 140 }

/* result */
gnomes.forEach { print($0.age) } // 3x 140
Run Code Online (Sandbox Code Playgroud)

  • 返回错误“$0 是不可变的”。这是我的错。我应该更精确:(我使用的是结构而不是类,我敢打赌是什么让它们默认不可变 (2认同)