如何在 Swift 中复制“字典”?
也就是说,获取另一个具有相同键/值但不同内存地址的对象。
此外,如何在 Swift 中复制对象?
谢谢,
“Dictionary”实际上是 swift 中的一个 Struct,它是一种值类型。 因此复制它就像:
let myDictionary = ...
let copyOfMyDictionary = myDictionary
复制对象(引用类型)有几个不同的答案。 如果对象采用
NSCopying
协议,那么你可以这样做:
let myObject = ...
let copyOfMyObject = myObject.copy()
如果您的对象不符合
NSCopying
那么您可能无法复制该对象。 根据对象的类,它可能会提供自己的方法来获取重复副本,或者如果该对象没有内部私有状态,那么您可以创建一个具有相同属性的新对象。
[编辑以纠正之前答案中的错误 - NSObject(类和协议)不提供复制或 copyWithZone 方法,因此不足以复制对象]
这里给出的所有答案都很棒,但他们忽略了一个关于警告您复制注意事项的关键点。
在 Swift 中,你可以有值类型(struct、enum、tuple、array、dict 等)或引用类型(类)。
如果你需要复制一个类对象,那么,你必须在你的类中实现方法
copyWithZone
,然后在对象上调用copy。
但是如果你需要复制一个值类型对象,例如。一个数组,您可以直接复制它,只需将其分配给一个新变量,如下所示:
let myArray = ...
let copyOfMyArray = myArray
但这只是浅复制。
如果您的数组包含类对象并且您也想复制它们,那么您必须单独复制每个数组元素。这将允许您制作深层复制。
这是额外的信息,我认为可以添加到上面写得很好的答案中已经提供的信息中。
物体
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 copy(with zone: NSZone? = nil) -> 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