web-dev-qa-db-ja.com

Swiftで「辞書」をコピーする方法は?

Swiftで「辞書」をコピーする方法は?

つまり、同じキー/値で異なるメモリアドレスを持つ別のオブジェクトを取得します。

さらに、Swiftでオブジェクトをコピーする方法は?

ありがとう、

27
allenlinli

「ディクショナリ」は、実際には値型であるSwiftの構造体です。したがって、コピーは次のように簡単です。

let myDictionary = ...
let copyOfMyDictionary = myDictionary

オブジェクト(参照型)をコピーするには、いくつかの異なる答えがあります。オブジェクトがNSCopyingプロトコルを採用している場合、次のことができます。

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

オブジェクトがNSCopyingに準拠していない場合、オブジェクトをコピーできない場合があります。オブジェクトのクラスに応じて、重複コピーを取得する独自のメソッドを提供するか、オブジェクトに内部プライベート状態がない場合は、同じプロパティで新しいオブジェクトを作成できます。

[前の回答の間違いを修正するために編集-NSObject(クラスとプロトコルの両方)はcopyまたはcopyWithZoneメソッドを提供しないため、オブジェクトをコピーするには不十分です]

67
ikuramedia

ここで与えられる答えはすべて素晴らしいですが、コピーの警告についてあなたに警告することに関して重要な点を見落としています。

Swiftには、値型(構造体、列挙型、タプル、配列、辞書など)または参照型(クラス)があります。

クラスオブジェクトをコピーする必要がある場合は、クラスにcopyWithZoneメソッドを実装し、オブジェクトでcopyを呼び出す必要があります。

ただし、必要な場合は、値型オブジェクトをコピーします。そして、配列のように新しい変数に割り当てるだけで、直接コピーできます。

let myArray = ...
let copyOfMyArray = myArray

ただし、これは浅いコピーのみです。

配列にクラスオブジェクトが含まれており、それらのコピーも作成する場合は、各配列要素を個別にコピーする必要があります。これにより、deep copyを作成できます。

これは追加の情報であり、上記の適切な回答で既に提示されている情報に追加すると考えました。

7
jarora

対象

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

2
Blank