【问题标题】:Swift forEach with assignment inside the blockSwift forEach 在块内分配
【发布时间】:2021-01-04 12:41:51
【问题描述】:

假设我有这个

var array = [1,2,3]

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

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

这怎么理解?

当我调用.append(17) 时,块内的数组是数组的副本,对吗?然后在循环之后将其分配给数组 var?还是事先做好的副本?

这究竟是怎么回事?

这个:

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

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

array = arrayCopy

或者这个:

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

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

还是别的什么?

【问题讨论】:

  • “它不会永远循环”——这是一件非常好的事情。

标签: swift struct foreach copy-on-write


【解决方案1】:

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

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

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

array = arrayCopy

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

【讨论】:

  • 不抱歉,我不想写它,我的意思是我想了解幕后发生的事情。
【解决方案2】:

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

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

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

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

var array = [1,2,3]

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 2019-02-03
    • 2021-11-20
    • 2013-09-04
    相关资源
    最近更新 更多