更新通过引用传递的数组中的项目

Pra*_*bhu 4 arrays pass-by-reference swift swift2 inout

更新数组中项目的最简单/正确的方法是什么?我希望调用者也拥有更新的数组。所以:

static func updateItem(updatedItem: Item, inout items: [Item]) -> Bool {
        var item = items.filter{ $0.id == updatedItem.id }.first
        if item != nil {
            item = updatedItem
            return true
        }

        return false
    }
Run Code Online (Sandbox Code Playgroud)

我希望调用者拥有更新的项目(带有更新的项目)。我认为上面代码的问题在于它只更新了局部变量 item。实际更新 items 数组中的相关项的最佳方法是什么?

mat*_*att 5

你这样做的方式与超人进入紧身衣的方式相同——一次一条腿。循环传入inout数组并替换id匹配的任何项目:

func updateItem(updatedItem: Item, items: inout [Item]) -> Bool {
    var result = false
    for ix in items.indices {
        if items[ix].id == updatedItem.id {
            items[ix] = updatedItem
            result = true
        }
    }
    return result
}
Run Code Online (Sandbox Code Playgroud)

请注意,这是 Swift 3 语法,inout在类型之前,而不是标签。

您可以使用map以下命令更“迅速”地编写它:

func updateItem(updatedItem: Item, items: inout [Item]) {
    items = items.map {
        $0.id == updatedItem.id ? updatedItem : $0
    }
}
Run Code Online (Sandbox Code Playgroud)

......但最终还是一样的。