Swift数组赋值为什么不一致(既不是引用也不是深度复制)?

14 浏览
0 Comments

Swift数组赋值为什么不一致(既不是引用也不是深度复制)?

我正在阅读文档,有些语言设计决定让我不停地摇头。但真正让我困惑的是如何处理数组。

我赶紧去游乐场试一试。你也可以尝试一下。第一个例子:

var a = [1, 2, 3]
var b = a
a[1] = 42
a
b

在这里,ab都是[1,42,3],我可以接受。数组被引用了 - 没问题!

现在看看这个例子:

var c = [1, 2, 3]
var d = c
c.append(42)
c
d

c[1, 2, 3, 42],但d[1, 2, 3]。也就是说,在上一个示例中看到了改变,但在这个示例中没有看到,文档说这是因为长度改变了。

现在,这个怎么样:

var e = [1, 2, 3]
var f = e
e[0..2] = [4, 5]
e
f

e[4, 5, 3],很酷。有一个多索引替换很好,但是f仍然没有看到改变,即使长度没有改变。

因此,总结一下,如果改变了1个元素,则对数组的常见引用会看到更改,但如果改变多个元素或附加项,则会进行复制。

对我来说,这似乎是一个非常糟糕的设计。我这样想对吗?我看不出数组应该像这样行动的理由吗?

编辑:数组已更改,现在具有值语义。更合理!

admin 更改状态以发布 2023年5月21日
0
0 Comments

从Swift语言的官方文档中看到:

请注意,使用下标语法设置新值时,数组不会被复制,因为使用下标语法设置单个值没有改变数组的长度的潜力。但是,如果您将新项追加到数组中,则会修改数组的长度。这促使Swift在追加新值时创建一个新副本的数组。此后,a是数组的一个单独的,独立的副本.....

在本文档中阅读整个数组的分配和复制行为部分。您会发现,当您替换数组中的一系列项时,数组会为所有项复制自身。

0
0 Comments

\n\n请注意,Xcode beta 3版本中更改了数组的语义和语法(博客文章),因此该问题已不再适用。以下答案适用于beta 2:\n\n这是出于性能原因。基本上,只要可能,它们就会尽力避免复制数组(并声称具有“类似于C的性能”)。引用语言书:\n\n对于数组,只有在执行可能修改数组长度的操作时,才会进行复制。这包括附加、插入或删除项目,或使用范围下标替换数组中的一系列项。\n\n我同意这有点令人困惑,但至少有一个清晰简单的描述它的工作原理。\n\n该部分还包括有关如何确保数组具有唯一引用、如何强制复制数组以及如何检查两个数组是否共享存储的信息。

0