当前位置: 首页 > 面试题库 >

Swift数组分配不一致(不是引用还是深拷贝)是有原因的吗?

彭存
2023-03-14
问题内容

我正在阅读文档,并且在语言的一些设计决策中不断摇头。但是真正让我感到困惑的是如何处理数组。

我冲到操场上,尝试了一下。您也可以尝试。所以第一个例子:

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]BUT d[1, 2, 3]。也就是说,d在上一个示例中看到了更改,但在此示例中没有看到它。文档说那是因为长度改变了。

现在,这个呢?

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

e[4, 5, 3],这很酷。拥有多索引替换很不错,但是f即使长度没有变化,STILL也看不到变化。

综上所述,如果更改1个元素,则对数组的公共引用会发生更改,但是如果更改多个元素或附加项,则会创建一个副本。

对我来说,这似乎是一个非常糟糕的设计。我这样想对吗?有没有我看不出为什么数组应该这样工作的原因?

编辑数组已更改,现在具有值语义。理智得多!


问题答案:

注意, 数组语义和语法在Xcode beta 3版本 (博客文章)中 已更改
,因此该问题不再适用。以下答案适用于Beta 2:

这是出于性能原因。基本上,他们会尽量避免复制数组(并声明“类似C的性能”)。引用语言书:

对于阵列,仅在执行可能会修改阵列长度的操作时才进行复制。这包括附加,插入或删除项目,或使用范围下标替换数组中的一系列项目。

我同意这有点令人困惑,但是至少对它的工作原理有一个清晰而简单的描述。

该部分还包括有关如何确保唯一引用阵列,如何强制复制阵列以及如何检查两个阵列是否共享存储的信息。



 类似资料:
  • 问题内容: 似乎对此产生了很多困惑和不同意见([1]和其他来源),究竟会产生深拷贝还是浅拷贝。 该测试表明该副本很深: 该测试表明该副本较浅: 解决方案是否仅是制作顶层维度的深层副本,而其他维度是浅层副本?真相是什么? 问题答案: 它产生一个浅表副本,即一个包含“旧”引用的 新 数组(指向相同的对象,这些对象没有被复制)。 特别是,如果您有嵌套数组,则不会复制这些数组。您将得到一个新数组,其“顶级

  • 我不确定以下内容是否会导致深度复制或浅复制? 有没有简单快速的方法可以深度复制字符串数组?

  • 本文向大家介绍什么是浅拷贝?它与C#中的深拷贝有何不同?,包括了什么是浅拷贝?它与C#中的深拷贝有何不同?的使用技巧和注意事项,需要的朋友参考一下 浅拷贝- 对象的浅表副本将复制“主”对象,但不复制内部对象。 “内部对象”在原始对象及其副本之间共享。 浅表副本的问题在于两个对象不是独立的。如果修改一个对象,则更改将反映在另一个对象中。 深度复制- 深层副本是对象的完全独立的副本。如果我们复制对象,

  • 本文向大家介绍jQuery的属性拷贝(extend)的实现原理是什么,如何实现深拷贝?相关面试题,主要包含被问及jQuery的属性拷贝(extend)的实现原理是什么,如何实现深拷贝?时的应答技巧和注意事项,需要的朋友参考一下 [jQuery] jQuery的属性拷贝(extend)的实现原理是什么,如何实现深拷贝?

  • 本文向大家介绍浅谈Python浅拷贝、深拷贝及引用机制,包括了浅谈Python浅拷贝、深拷贝及引用机制的使用技巧和注意事项,需要的朋友参考一下 这礼拜碰到一些问题,然后意识到基础知识一段时间没巩固的话,还是有遗忘的部分,还是需要温习,这里做份笔记,记录一下 前续 先简单描述下碰到的题目,要求是写出2个print的结果 可以看到,a指向了一个列表list对象,在Python中,这样的赋值语句,其实内

  • 主要内容:到底是浅拷贝还是深拷贝对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存。例如: b 和 obj2 都是以拷贝的方式初始化的,具体来说,就是将 a 和 obj1 所在内存中的数据按照二进制位(Bit)复制到 b 和 obj2 所在的内存, 这种默认的拷贝行为就是 浅拷贝 ,这和调用 memcpy() 函数的效果非常类似。 对于简单的类,默认的拷贝构造函数一般就够用了,我们也没有必要再显式地定义一