【问题标题】:Assignment always make copying in swift作业总是快速复制
【发布时间】:2014-11-05 01:52:12
【问题描述】:
var list1 = [1, 2, 3, 4, 5]
var list2 = list1
list2.removeLast()
println(list1)
println(list2)

这是一个简单的代码:

  1. 将 list1 分配给 list2
  2. 从 list2 中移除对象
  3. 该对象已从列表 2 中删除 但仍存在于列表 1 中

似乎赋值做了一些类似于复制但没有赋值指针的事情。

我想知道有没有官方文档说明以及如何制作enter code here

【问题讨论】:

    标签: swift assign


    【解决方案1】:

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

    类是引用类型,而赋值会将引用复制到实例。

    您可以在Structures and Enumerations Are Value Types 中阅读更多相关信息

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

    【讨论】:

    • 这解释了文档,但没有回答如何使它工作!
    • @NeerajNama 以及 OP 正在询问 我想知道是否有任何官方文件解释它以及如何制作它。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      其他 cmets/answers 遗漏的文档中有一个重要说明:

      Structures and Enumerations Are Value Types底部:

      注意

      上面的描述是指字符串、数组和 字典。您在代码中看到的行为将始终像 复制发生。但是,Swift 只在后面执行 actual 复制 绝对有必要这样做的场景。斯威夫特管理所有 价值复制以确保最佳性能,您不应避免 分配尝试抢占此优化。

      因此,尽管您应该始终处理分配,例如“副本”,但除非确实需要,否则不要尝试“围绕它进行优化”,除非您确定需要这样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-08
        • 1970-01-01
        • 2018-07-04
        • 2017-01-05
        • 1970-01-01
        • 1970-01-01
        • 2013-04-18
        • 2018-11-03
        相关资源
        最近更新 更多