微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift forEach 在块内赋值

如何解决Swift forEach 在块内赋值

假设我有这个

var array = [1,2,3]

array.forEach {
    array.append(17)
    print($0)
}

它不会永远循环,而是会打印 1、2 和 3,然后数组有 6 个元素:[1,3,17,17]

如何理解?

块内的数组是我调用 .append(17) 时数组的副本,对吗?然后在循环之后它被分配给数组 var?还是手抄的?

这到底是怎么回事?

这个:

var array = [1,3]
var arraycopy: [Int]

array.forEach {
    arraycopy.append(17)
    print($0)
}

array = arraycopy

或者这个:

var array = [1,3]
var arraycopy = array

arraycopy.forEach {
    array.append(17)
    print($0)
}

或者别的什么?

解决方法

有趣的观察。当你创建一个 forEach 时,第二个答案看起来更准确,一个当前数组的副本被创建并循环遍历它的元素。

var array = [1,2,3]
var arrayCopy = array

arrayCopy.forEach {
    array.append(17)
    print($0)
}

如果您在操场上运行以下代码,您将获得显示在循环的每个循环中添加到主数组的元素的输出

var array = [1,3]

array.forEach {_ in
    array.append(17)
    print(array)
}


//You will get following output 
//[1,3,17]
//[1,17,17]
,

第一个是准确的并且工作正常,但您必须将 arrayCopy 初始化为一个空数组,如下所示:

var array = [1,3]
var arrayCopy: [Int] = []

array.forEach {
    arrayCopy.append(17)
    print($0)
}

array = arrayCopy

这将为您提供与您已经将输出添加到数组中相同的输出,但仅当您想制作副本并将其放入原始数组时才有效。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。