【问题标题】:Why calling a mutating method directly on ArraySlice doesn't trigger the copy-on-write?为什么直接在 ArraySlice 上调用变异方法不会触发写时复制?
【发布时间】:2019-10-26 03:51:12
【问题描述】:

为什么直接在 ArraySlice 上调用变异方法不会触发写时复制?唯一的区别是将切片分配给变量,对吗?

我的示例代码:

var numbers = [15, 40, 10, 30, 60, 25, 5, 100]
numbers[0..<4].sort()
numbers
// [10, 15, 30, 40, 60, 25, 5, 100]

var n = numbers[4..<8]
n.sort()
numbers
// [10, 15, 30, 40, 60, 25, 5, 100]

【问题讨论】:

  • 欢迎来到 SO!当您提出问题时,请尝试添加最少的内容:输入样本、预期输出样本、您尝试了什么、研究以及您卡在哪里。你尝试了什么?有什么研究吗?

标签: arrays swift copy-on-write


【解决方案1】:

在您的代码中,您写道:

var numbers = [15, 40, 10, 30, 60, 25, 5, 100]
numbers[0..<4].sort()
numbers
// [10, 15, 30, 40, 60, 25, 5, 100]

在这种情况下,您直接作用于数组的一个子集。您对数组的前 4 个元素([0] 到 [3])进行排序(就地)。那么当你输出numbers时,你会看到前4个元素是按顺序排列的。

var n = numbers[4..<8]
n.sort()
numbers
// [10, 15, 30, 40, 60, 25, 5, 100]

然后复制数组的下4个元素([4]到[7])到一个变量n中。然后你 sort() n。请注意,numbers 未触及。

你为什么期待不同的事情发生?

【讨论】:

  • numbers[0..
  • 数组切片是独立的值,改变一个不会影响另一个:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 2013-08-16
  • 2021-11-29
  • 2018-09-28
  • 2016-03-20
相关资源
最近更新 更多