如何在Swift中复制“词典”?
即,获取具有相同键/值但内存地址不同的另一个对象。
此外,如何在Swift中复制对象?
谢谢,
答案 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