【问题标题】:How to copy a "Dictionary" in Swift?如何在 Swift 中复制“字典”?
【发布时间】:2014-07-18 03:25:14
【问题描述】:

如何在 Swift 中复制“字典”?

即获取另一个具有相同键/值但内存地址不同的对象。

另外,如何在 Swift 中复制一个对象?

谢谢,

【问题讨论】:

    标签: copy swift deep-copy


    【解决方案1】:

    'Dictionary' 在 swift 中实际上是一个 Struct,它是一个值类型。所以复制它很简单:

    let myDictionary = ...
    let copyOfMyDictionary = myDictionary
    

    复制一个对象(它是一个引用类型)有几个不同的答案。如果对象采用NSCopying协议,那么你可以这样做:

    let myObject = ...
    let copyOfMyObject = myObject.copy()
    

    如果您的对象不符合NSCopying,那么您可能无法复制该对象。根据对象的类,它可能会提供自己的方法来获取副本,或者如果对象没有内部私有状态,那么您可以创建一个具有相同属性的新对象。

    [已编辑以纠正上一个答案中的错误 - NSObject(类和协议)不提供复制或 copyWithZone 方法,因此不足以复制对象]

    【讨论】:

      【解决方案2】:

      这里给出的所有答案都很棒,但他们错过了一个关键点,即警告您复制的注意事项。

      在 Swift 中,您有值类型(结构、枚举、元组、数组、字典等)或引用类型(类)。

      如果你需要复制一个类对象,那么你必须在你的类中实现copyWithZone方法,然后在对象上调用copy。

      但是如果你需要复制一个值类型的对象,例如。一个数组,您可以直接复制它,只需将其分配给一个新变量,如下所示:

      let myArray = ...
      let copyOfMyArray = myArray
      

      但这只是浅拷贝。

      如果您的数组包含类对象,并且您还想复制它们,那么您必须单独复制每个数组元素。这将允许您制作深拷贝

      这是我认为可以添加到上面精心编写的答案中已经提供的信息的额外信息。

      【讨论】:

      • 我在另一个 ST 问题中确实问过这个问题 :)。
      【解决方案3】:

      对象

      class Person: NSObject, NSCopying {
          var firstName: String
          var lastName: String
          var age: Int
      
          init(firstName: String, lastName: String, age: Int) {
              self.firstName = firstName
              self.lastName = lastName
              self.age = age
          }
      
          func copyWithZone(zone: NSZone) -> AnyObject {
              let copy = Person(firstName: firstName, lastName: lastName, age: age)
              return copy
          }
      }
      

      用法

      let paul = Person(firstName: "Paul", lastName: "Hudson", age: 35)
      let sophie = paul.copy() as! Person
      
      sophie.firstName = "Sophie"
      sophie.age = 5
      
      print("\(paul.firstName) \(paul.lastName) is \(paul.age)")
      print("\(sophie.firstName) \(sophie.lastName) is \(sophie.age)")
      

      来源:https://www.hackingwithswift.com/example-code/system/how-to-copy-objects-in-swift-using-copy

      【讨论】:

      • 看你从文章中复制的代码,你是不是忘记了正确的方法签名?即:copy(with zone: NSZone? = nil)
      猜你喜欢
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 2021-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多