【发布时间】:2014-07-18 03:25:14
【问题描述】:
如何在 Swift 中复制“字典”?
即获取另一个具有相同键/值但内存地址不同的对象。
另外,如何在 Swift 中复制一个对象?
谢谢,
【问题讨论】:
如何在 Swift 中复制“字典”?
即获取另一个具有相同键/值但内存地址不同的对象。
另外,如何在 Swift 中复制一个对象?
谢谢,
【问题讨论】:
'Dictionary' 在 swift 中实际上是一个 Struct,它是一个值类型。所以复制它很简单:
let myDictionary = ...
let copyOfMyDictionary = myDictionary
复制一个对象(它是一个引用类型)有几个不同的答案。如果对象采用NSCopying协议,那么你可以这样做:
let myObject = ...
let copyOfMyObject = myObject.copy()
如果您的对象不符合NSCopying,那么您可能无法复制该对象。根据对象的类,它可能会提供自己的方法来获取副本,或者如果对象没有内部私有状态,那么您可以创建一个具有相同属性的新对象。
[已编辑以纠正上一个答案中的错误 - NSObject(类和协议)不提供复制或 copyWithZone 方法,因此不足以复制对象]
【讨论】:
这里给出的所有答案都很棒,但他们错过了一个关键点,即警告您复制的注意事项。
在 Swift 中,您有值类型(结构、枚举、元组、数组、字典等)或引用类型(类)。
如果你需要复制一个类对象,那么你必须在你的类中实现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 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)