Swiftで「辞書」をコピーする方法は?
つまり、同じキー/値で異なるメモリアドレスを持つ別のオブジェクトを取得します。
さらに、Swiftでオブジェクトをコピーする方法は?
ありがとう、
「ディクショナリ」は、実際には値型であるSwiftの構造体です。したがって、コピーは次のように簡単です。
let myDictionary = ...
let copyOfMyDictionary = myDictionary
オブジェクト(参照型)をコピーするには、いくつかの異なる答えがあります。オブジェクトがNSCopying
プロトコルを採用している場合、次のことができます。
let myObject = ...
let copyOfMyObject = myObject.copy()
オブジェクトがNSCopying
に準拠していない場合、オブジェクトをコピーできない場合があります。オブジェクトのクラスに応じて、重複コピーを取得する独自のメソッドを提供するか、オブジェクトに内部プライベート状態がない場合は、同じプロパティで新しいオブジェクトを作成できます。
[前の回答の間違いを修正するために編集-NSObject(クラスとプロトコルの両方)はcopyまたはcopyWithZoneメソッドを提供しないため、オブジェクトをコピーするには不十分です]
ここで与えられる答えはすべて素晴らしいですが、コピーの警告についてあなたに警告することに関して重要な点を見落としています。
Swiftには、値型(構造体、列挙型、タプル、配列、辞書など)または参照型(クラス)があります。
クラスオブジェクトをコピーする必要がある場合は、クラスにcopyWithZone
メソッドを実装し、オブジェクトでcopyを呼び出す必要があります。
ただし、必要な場合は、値型オブジェクトをコピーします。そして、配列のように新しい変数に割り当てるだけで、直接コピーできます。
let myArray = ...
let copyOfMyArray = myArray
ただし、これは浅いコピーのみです。
配列にクラスオブジェクトが含まれており、それらのコピーも作成する場合は、各配列要素を個別にコピーする必要があります。これにより、deep copyを作成できます。
これは追加の情報であり、上記の適切な回答で既に提示されている情報に追加すると考えました。
対象
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