var list1 = [1, 2, 3, 4, 5]
var list2 = list1
list2.removeLast()
println(list1)
println(list2)
这是一个简单的代码:
似乎分配就像复制一样,但没有分配指针。
我想知道是否有任何官方文件解释它以及如何制作enter code here
答案 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管理所有 重复值以确保最佳性能,您不应该避免 用于尝试抢占此优化的分配。
因此,虽然你应该总是对待作业,例如“复制”,但除非确实需要,否则它并不是,所以不要试图'围绕它优化'除非你确定需要。