Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 更新引用传递的数组中的项_Arrays_Swift_Swift2_Pass By Reference_Inout - Fatal编程技术网

Arrays 更新引用传递的数组中的项

Arrays 更新引用传递的数组中的项,arrays,swift,swift2,pass-by-reference,inout,Arrays,Swift,Swift2,Pass By Reference,Inout,更新数组中的项目最简单/正确的方法是什么?我希望调用方也有更新的数组。因此: static func updateItem(updatedItem: Item, inout items: [Item]) -> Bool { var item = items.filter{ $0.id == updatedItem.id }.first if item != nil { item = updatedItem re

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

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
    }

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

您正在变异
,它只是数组中实例的一个副本(如果
是一个值类型,例如
结构
元组
,或
枚举
),或者对它的引用(如果
是一个引用类型,例如`类')。在任何一种情况下,阵列都不会受到影响

您需要在数组中找到实例的索引,然后在该索引处修改数组

func updateItem(updatedItem: Item, inout items: [Item]) -> Bool {
    guard let index = items.index(where: { $0.id == updatedItem.id }) else {
        return false // No matching item found
    }

    items[index] = updatedItem
    return true
}
不过,这一切都相当笨拙。如果改用字典,将
id
映射到具有该
id
的实例,效果会更好。这意味着您将有快速、恒定的时间查找,并且将更加方便。下面是它的外观:

// Assuming the "id" is an Int
func updateItem(updatedItem: Item, items: inout [Int: Item]) -> Bool {
    return items.updateValue(updatedItem, forKey: updatedItem.id) != nil
}

就像超人穿紧身衣一样——一次一条腿。在传入的
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
}
请注意,这是Swift 3语法,其中
inout
位于类型之前,而不是标签之前

通过使用
map
,您可以更“快速”地编写它:

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

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

如果没有具有相同id的现有项,您想对更新项做什么?谢谢,使用字典调用代码会是什么样子?同样,您只需传入新项和所有项的dict shmm,它表示类型[item]的值没有成员索引。@Prabhu我认为Swift 2中不存在这样的函数。你可以自己在序列上写一个扩展名来添加它,但实际上,只需使用Swift 3Hmm是的,问题是我们还没有准备好迁移到Swift 3,所以我想必须做扩展名。我返回bool,因为调用方根据是否找到项目做一些额外的事情。如果在您的“快速”方法中找不到项,如何返回false?我重写了第一个方法以返回Bool,我建议您使用它。使用第二种方法不会节省成本-
map
仍然是一个循环。