如何复制"字典"在斯威夫特?

时间:2014-07-18 03:25:15

标签: copy swift deep-copy

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

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

此外,如何在Swift中复制对象?

谢谢,

3 个答案:

答案 0 :(得分:66)

'Dictionary'实际上是swift中的一个Struct,它是一个值类型。所以复制它就像:

let myDictionary = ...
let copyOfMyDictionary = myDictionary

复制对象(作为参考类型)有几个不同的答案。如果对象采用NSCopying协议,那么您可以这样做:

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

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

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

答案 1 :(得分:6)

这里给出的所有答案都很棒,但他们错过了关于警告你复制警告的关键点。

在Swift中,您有值类型(struct,enum,tuple,array,dict等)或引用类型(类)。

如果需要复制类对象,则必须在类中实现方法copyWithZone,然后在对象上调用copy。

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

let myArray = ...
let copyOfMyArray = myArray

但这只是浅层复制。

如果您的数组包含类对象,并且您想要复制它们,则必须单独复制每个数组元素。这样您就可以制作深层复制

这是额外的信息,我认为这些信息会添加到上面写得很好的答案中已经提供的信息中。

答案 2 :(得分:2)

对象

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