Ios Swift地图没有';更改数组属性时无法工作
我有以下结构,带有一些属性:Ios Swift地图没有';更改数组属性时无法工作,ios,arrays,swift,Ios,Arrays,Swift,我有以下结构,带有一些属性: 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",isSelect
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)
]
但当我想用高阶函数映射更改“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
}
}
map
不是一个变异函数。它可用于迭代集合,并对集合的所有元素应用相同的转换函数,将转换后的值存储在新集合中,然后返回新集合
您需要使用简单循环并手动修改原始数组中的选定值,或者只需使用map
的返回值
private func select(partner: Partner) -> [Partner] {
return parceiros.map { (parceiro) -> Partner in
var _parceiro = parceiro
_parceiro.isSelected = parceiro.id == partner.id
return _parceiro
}
}
parceiros = select(parceiros[0])
如果您想使用map
方法,还可以将闭包简化为一行,如下所示:
private func select(partner: Partner, from partners: [Partner]) -> [Partner] {
return partners.map { return Partner(id: $0.id, nome: $0.nome, icone: $0.icone, isSelected: $0.id == partner.id)}
}
let selectedPartners = select(partner: parceiros[1], from: parceiros)
使用常规循环的方法:
private func select(partner: Partner){
for i in parceiros.indices {
parceiros[i].isSelected = parceiros[i].id == partner.id
}
}
您混淆了引用和值类型。当您使用Swift结构数组(struct是值类型)时,它们会创建您放入其中的任何内容的副本。当您从结构中检索任何内容时,它将对其进行另一次复制。基本上,映射从旧数组中创建新结构的新数组。您必须重新分配该数组:
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。这意味着数组将保留对对象实际实例的引用,而不是保留结构的副本
class Partner {
let id: Int
let nome: String
let icone: String
var isSelected : Bool
}
以及对其中某个特定对象的更改。不过,你不需要绘制地图。如果要对数组的每个成员应用某些内容,请使用forEach
,如果要对数组的一部分应用某些内容,请首先使用过滤器
:
private func select(partner: Partner){
parceiros.forEach { $0.isSelected = (parceiro.id == partner.id) }
}
小提示:您在
parceiros.map{(parceiro)->Partner in
行上没有警告,告诉调用“map”的结果未使用
?这不是让它静音的提示,而是因为响应在其中。map()
返回转换后的结果,它不会修改调用它的当前对象,它不是一个变异方法。