Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Copy 如何复制一个;字典;斯威夫特?_Copy_Swift_Deep Copy - Fatal编程技术网

Copy 如何复制一个;字典;斯威夫特?

Copy 如何复制一个;字典;斯威夫特?,copy,swift,deep-copy,Copy,Swift,Deep Copy,如何在Swift中复制“词典” 也就是说,获取另一个具有相同键/值但不同内存地址的对象 此外,如何在Swift中复制对象 谢谢,字典实际上是swift中的结构,它是一种值类型。因此,复制它非常容易: let myDictionary = ... let copyOfMyDictionary = myDictionary 复制对象(引用类型)有两个不同的答案。如果对象采用NSCopying协议,则您只需执行以下操作: let myObject = ... let copyOfMyObject =

如何在Swift中复制“词典”

也就是说,获取另一个具有相同键/值但不同内存地址的对象

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


谢谢,

字典实际上是swift中的结构,它是一种值类型。因此,复制它非常容易:

let myDictionary = ...
let copyOfMyDictionary = myDictionary
复制对象(引用类型)有两个不同的答案。如果对象采用
NSCopying
协议,则您只需执行以下操作:

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

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

对象

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
    }
}
用法


资料来源:

这里给出的所有答案都很好,但它们忽略了一个关键点,即警告您复制的注意事项

在Swift中,可以使用值类型(结构、枚举、元组、数组、dict等)或引用类型(类)

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

但如果需要复制值类型对象,例如数组,则可以直接复制,只需将其分配给新变量,如下所示:

let myArray = ...
let copyOfMyArray = myArray
但这只是肤浅的复制。

如果数组包含类对象,并且您也希望复制它们,则必须单独复制每个数组元素。这将允许您进行深度复制


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

我在我的另一个问题中问过这一点:)。看看你从文章中复制的代码,你是否忘记了正确的方法签名?即:
copy(带区域:NSZone?=nil)
let myArray = ...
let copyOfMyArray = myArray