【问题标题】:What's the difference between unshare() and copy()?unshare() 和 copy() 有什么区别?
【发布时间】:2014-07-25 12:38:39
【问题描述】:

unshare()copy() 都用于复制数组,但我看不出有什么区别。

【问题讨论】:

    标签: arrays swift


    【解决方案1】:

    取消分享

    正如Apple documentation unshare 所说的,确保数组的副本是唯一的,所以当您调用 unshare 时,您会得到数组的非共享副本,这可能如果这是对数组的唯一引用,则为同一个数组。

    复制

    另一方面,copy 强制复制数组并返回包含复制项的新数组

    因此,如果您想拥有数组的 2 个独立副本,则应使用 copy 在其他情况下,您可以使用 unsare 以确保数组没有其他引用。

    【讨论】:

    • 我正在读这本书,当我来到这个部分时,我想在 SO 中搜索。我明白书上说的是什么,但仍然看不出区别。复制或取消共享为您提供了一个数组,如果您更改新对象中的任何对象,则该数组不会影响源,反之亦然。这就是为什么看不到差异的原因。
    • 好吧,使用copy,您将获得与原始源不同的数组的新副本,并且如果您修改该副本,则源不会被修改。使用unshare,您可以获得一个新副本,如果有更多对该数组的引用,但如果这是唯一的引用,则保留相同的引用,因此在unshare 的情况下,如果没有其他副本,您将修改原始数组,因为不会复制...我希望现在更清楚...
    • 谢谢你的解释,我在理论上理解,但结果并没有改变,两者都是一样的。
    • 还要注意unshare 在接收器上运行,在适当的位置修改它。另一方面,copy 返回一个新数组。这意味着,除其他外,unshare 不能在常量上调用,而 copy 可以。
    【解决方案2】:

    unshare() 如果被调用者尚未共享,则不会执行任何操作。 copy() 无论如何都会复制它。

    【讨论】:

    • 所以unshare 就像“如果需要就复制”
    • 不严格,但你可以这样想。
    【解决方案3】:

    这在 Beta 3 中有所改变。unshare() 和 copy() 都已从 Array 中删除。数组现在是写时复制,默认行为很像总是调用 unshare()。

    http://blog.human-friendly.com/swift-arrays-beta-3-hooray

    【讨论】:

      【解决方案4】:

      来自documentation

      如果您只是需要确保您对数组内容的引用是唯一存在的引用,请调用 unshare 方法,而不是 copy 方法。除非有必要,否则 unshare 方法不会复制数组。复制方法总是复制数组,即使它已经被取消共享。

      基本上,如果它是唯一的参考,unshare 不会做任何事情。无论哪种方式,复制都会做到这一点。

      【讨论】:

        【解决方案5】:

        根据 Swift 编程指南(第 298 页):

        “如果您只需要确保您对数组的引用 contents 是唯一存在的引用,调用 unshare 方法, 不是复制方法。 unshare 方法不会复制 数组,除非有必要这样做。复制方法总是复制 数组,即使它已经被取消共享。”

        摘自:Apple Inc. “Swift 编程语言”。电子书。 https://itun.es/us/jEUH0.l

        【讨论】:

          猜你喜欢
          • 2012-08-16
          • 2017-04-12
          • 1970-01-01
          • 1970-01-01
          • 2022-07-22
          • 2019-02-16
          • 2021-11-01
          • 2016-09-11
          • 2010-10-02
          相关资源
          最近更新 更多