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

变异ArraySlice会实例化一个新的数组实例吗?

夏弘义
2023-03-14
问题内容
var absences = [0, 2, 0, 4, 0, 3, 1, 0]
let midpoint = absences.count / 2

var firstHalf = absences.prefix(upTo: midpoint)
let secondHalf = absences.suffix(from: midpoint)

苹果报价:

firstHalf切片和secondHalf切片都不分配自己的任何新存储。取而代之的是,每个视图都显示了不存在数组的存储视图。

当我尝试如下更改时firstHalf

firstHalf[1] = 19

firstHalf更改的值,但原始数组absences保持不变(firstHalf[1]等于19
absences[1]等于2),所以在后台发生了什么。我是否通过更改数组切片来实例化新数组?提前致谢。


问题答案:

是的,标准库的集合类型(包括ArrayArraySlice)都具有写时复制行为。这意味着它们可以与其他集合 共享
其元素的存储,直到它们被突变为止,在这种情况下,他们将获得它们自己的副本。

在你的情况下,底层数组缓冲该切片firstHalf具有视图上被非唯一地引用(如二者absencessecondHalf也有一个视图在其上)。因此,当您进行mutate时firstHalf,将触发一个副本–创建一个包含切片元素(但不一定是
整个 数组)的 缓冲区。 __

firstHalf现在,在此新缓冲区上具有唯一的视图,并且absencessecondHalf都共享对旧数组缓冲区的视图。因此firstHalf,现在可以在不影响原始数组元素的情况下更改其缓冲区的元素,从而保留值的语义。



 类似资料:
  • 有人能解释一下下面的代码是如何毫无例外地工作的吗。我在想,当为星期天创建新实例时,它也会为星期一(星期天内)创建一个新实例,然后再为星期天(星期一内)创建一个新实例,以此类推。。。类似递归的东西,因为它们都是课程周的一部分。但我的理解是错误的,因为下面的代码运行良好。 我有这个疑问,当我读到java枚举。

  • 问题内容: 我知道这个问题听起来很模糊,因此我将通过一个示例来使其更加清楚: 这就是我要做的。你会怎么做?我当然可以这样使用eval(): 但是我宁愿远离eval()。没有eval(),有没有办法做到这一点? 问题答案: 首先将类名放入变量中: 这通常是您将以Factory模式包装的东西。

  • 我有一个基于Spring的WebApp。在我的应用程序上下文中,我定义了这个bean: 我有一个Spring调度servlet定义和一个具有注释的类,我自动连接了这个bean,期望Spring只实例化这个类一次。但是,根据以下调试代码,Spring不止一次实例化这个类: 原因可能是什么? 注意:我使用spring 3.1.2.RELEASE 编辑:多亏了给我的提示,我找到了罪魁祸首。 除了Disp

  • 对于某些参数将成功实例化,而对于其他参数则不会。 不修改或扩展的定义,是否可以编写一个bool变量模板: 这样为真,是否会成功实例化? 这将输出,预期的输出是吗? 什么给?

  • 我有一个dataframe,我在我的第一列groupByKey上有一个字符串数组,我想在我的dataframe的新列中实例一个新对象。 我将实例的对象具有以下结构:

  • 我正在使用Hibernate4和基于xml的映射。这是我得到的例外