作业总是快速复制

时间:2014-09-11 07:48:34

标签: swift assign

var list1 = [1, 2, 3, 4, 5]
var list2 = list1
list2.removeLast()
println(list1)
println(list2)

这是一个简单的代码:

  1. 将list1分配给list2
  2. 从list2中删除对象
  3. 该对象已从list2中移除但仍然存在于list1
  4. 似乎分配就像复制一样,但没有分配指针。

    我想知道是否有任何官方文件解释它以及如何制作enter code here

3 个答案:

答案 0 :(得分:6)

数组是结构,结构是值类型,因此它们是按值而不是按引用复制的。 字典也是如此,如果您分配给另一个变量,则会创建一个副本。

类是引用类型,赋值复制对实例的引用。

您可以在Structures and Enumerations Are Value Types

中详细了解相关内容

旁注:传递给函数的结构是不可变的 - 你不能在函数中修改它,除非你使用inout属性通过引用传递它

答案 1 :(得分:1)

是的Apple Swift文档解释说Swift数组(字典也是)是一个结构,而不是一个对象和结构在它们在代码中传递时被复制。如果您创建结构,则始终复制它们。如果你想通过引用传递它,你应该创建类。

答案 2 :(得分:1)

文档中有一个重要的注释,其他评论/答案错过了:

Structures and Enumerations Are Value Types的底部:

  

请注意

     

上面的描述是指“复制”字符串,数组和   字典。您在代码中看到的行为将始终如同a   副本发生了。但是,Swift仅执行实际副本   绝对有必要这样做的场景。 Swift管理所有   重复值以确保最佳性能,您不应该避免   用于尝试抢占此优化的分配。

因此,虽然你应该总是对待作业,例如“复制”,但除非确实需要,否则它并不是,所以不要试图'围绕它优化'除非你确定需要。