Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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
Ios Swift地图没有';更改数组属性时无法工作_Ios_Arrays_Swift - Fatal编程技术网

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()
返回转换后的结果,它不会修改调用它的当前对象,它不是一个变异方法。