gpt4 book ai didi

ios - 更改数组属性时 Swift 映射不起作用

转载 作者:搜寻专家 更新时间:2023-10-31 08:28:19 25 4
gpt4 key购买 nike

我有以下结构,具有一些属性:

struct Partner {
let id: Int
let nome: String
let icone: String
var isSelected : Bool
}

所以我初始化了一个简单的数组并在其中放了一些数据:

var parceiros : [Partner] = [
Partner(id: 1, nome: "Personal Profile", icone: "btPersonal",isSelected : true),
Partner(id: 2, nome: "Professional Profile", icone: "btProfessional", isSelected: false)
]

但是当我想用高阶函数 Map 更改“isSelected”属性时,在 swift 4 中,数组根本不更新。这很奇怪,因为 var "_parceiro"在返回循环中有正确的值。但函数执行后数组返回原始值。

private func select(partner: Partner){
let _ = parceiros.map { (parceiro) -> Partner in
var _parceiro = parceiro
_parceiro.isSelected = parceiro.id == partner.id ? true : false
return _parceiro
}
}

最佳答案

您混淆了引用类型和值类型。当您使用 Swift 结构数组(结构是值类型)时,它们会创建您放入其中的任何内容的副本。当您从结构中检索任何内容时,它会制作另一个副本。基本上映射创建一个从旧数组中获取的新结构的新数组。你必须重新分配那个数组:

private func select(partner: Partner){
parceiros = parceiros.map { (parceiro) -> Partner in
var _parceiro = parceiro
_parceiro.isSelected = parceiro.id == partner.id ? true : false
return _parceiro
}
}

或者你可以使用引用类型:类。这意味着数组将保留对对象实际实例的引用,而不是保留结构的副本。

class Partner {
let id: Int
let nome: String
let icone: String
var isSelected : Bool
}

并更改其中的特定对象。不过,您不需要映射。如果你想为数组的每个成员应用一些东西,使用 forEach,如果你想为数组的一部分应用一些东西 - 首先使用 filter:

private func select(partner: Partner){
parceiros.forEach { $0.isSelected = (parceiro.id == partner.id) }
}

关于ios - 更改数组属性时 Swift 映射不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52630384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com