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

如何在Swift中创建不可变数组?

周昊乾
2023-03-14
问题内容

如何在Swift中创建不可变数组?

简要阅读文档会建议您可以做

let myArray = [1,2,3]

但是可悲的是,这实际上产生了一个可变的,固定大小的数组。这种可变性通常会产生令人困惑的别名和令人怀疑的别名,并且函数会改变其参数:

let outterArray = [myArray, myArray]
outterArray[0][0] = 2000
outterArray //=> [[2000,2,3],[2000,2,3]]   surprise!

func notReallyPure(arr:Int[]) -> () { arr[0] = 3000 }
notReallyPure(myArray)
myArray // => [3000,2,3]

没有比C好多少了。

如果我想要不变性,最好的选择是将其包装NSArray成这样:

let immutableArray = NSArray(myArray: [1,2,3])

好像疯了。我在这里想念什么?

更新(2015-07-26):

这个问题可以追溯到Swift的早期。从那以后,对Swift进行了更新,以使不可变数组实际上是不可变的,如下所示。


问题答案:

Xcode 6 beta 3改变了这种情况。正如您所描述的,过去数组是半可变的,它们的元素是可变的,但长度是固定的,现在不可变的数组与字典具有相同的值语义:

从Xcode 6 beta 3发行说明中:

•Swift中的数组已经过完全重新设计,以具有字典和String等在Swift中始终具有的全值语义。这解决了各种可变性问题-
现在’let’数组是完全不变的,’var’数组是完全可变的-
可与Dictionary和String正确组合,并解决其他更深层次的问题。如果您习惯使用NSArray或C数组,则值语义可能会令人吃惊:现在,数组的副本使用高效的惰性副本实现生成所有元素的完整且独立的副本。这是Array的一项重大更改,仍然存在一些性能问题需要解决。请!请参阅Swift编程语言以获取更多信息。(17192555)

Swift书中有关阵列的原始信息已于2014年7月7日更新,以反映beta
3的更改。(如果您像以前一样在Mac上使用iBooks,则可能需要删除并重新下载它才能获取7月7日的更新,但我无法自动更新。)



 类似资料:
  • 问题内容: 在目标c中,我可以创建一个类数组并在方法中使用它 但是,swift没有“类”功能。返回类的元类型会导致错误 最后一行导致“致命错误:数组元素无法桥接到Objective-C” 如何在Swift中创建类数组? 问题答案: 显然,此问题已在Beta 3中修复,因此不再需要解决方法 我发现了一个纯粹的Swift hack: 先前的答案 我无法在Swift中以任何方式获取实例。似乎无法直接从转

  • 问题内容: 我试图设置一个全局变量。就我而言,只是一个布尔标志,用于指示是否首次显示视图: 呈现视图后,我想将此标志设置为false: 然后检查它: 因此,我想创建一个全局变量。在哪里以及如何?我试过了: 在我的视图控制器领域 在我的AppDelegate.swift文件中的方法中 在班上 没运气。我收到一条错误消息 (注意:我意识到,在这个问题中,我背叛了我对Swift中如何处理范围的无知。请原

  • 我需要将可变列表对象转换为不可变列表。java中可能的方法是什么?

  • Kotlin有一个const关键字。但我不认为kotlin中的常数是我所认为的。这似乎与C中的const非常不同。在我看来,its仅适用于静态成员和Java中的原语,不针对类变量进行编译: 由于这似乎不起作用,我认为我真正想要的是第二个类,它删除我不想支持的操作: 这种方法的明显缺点是,我不能忘记更改这个类,以防我更改,这对我来说非常危险。 但是我不确定如何做到这一点。所以问题是:如何用意识形态静

  • 问题内容: 我已经通读了Apple的Swift文档,却对如何创建模块或如何将类或结构成员定义为私有或公共一无所知。 语法中有对import语句的引用,但找不到有关它做什么或如何使用的信息。 有谁知道我在哪里可以找到这个? 问题答案: 更新资料 您可以使用框架对快速项目进行模块化。 我们通过为每个模块创建单独的框架项目并通过Xcode工作区将它们链接来实现模块化。当我们将组件分为不同的项目时,它看起

  • 问题内容: 我一直在四处搜寻有关如何使用Swift 2.0为MapView制作MKCircle注释的良好解释,但我似乎找不到足够的解释。有人可以张贴一些示例代码来显示如何创建MKCircle批注吗?这是我用来制作地图并获取坐标的代码。 问题答案: 将展示有关如何使用xcode 8.3.3的swift 3在地图视图上创建圆形叠加层的分步方法 在您的主故事板文件中,将地图工具包视图拖到故事板的场景(视