2017-07-26 6 views
0

私はクラスのインスタンスを取り込んのinitを持っている(私は誰もがそれはそれは、参照渡しだ意味ことを知っている願っていた)スウィフトが渡されたクラスのインスタンスのコピー

私がコピーできるようにしたいを作りますオブジェクトと2つのクラスのインスタンス変数に格納するように、私は特定のポイントに行っていた変更を設定する "リセット"として動作するように意図されている関数を持っています。

そうのようなもの:

convenience init(_ item:Item?){ 
    self.init() 
    self.item = item 
    self.undoItem = item 
} 


func reset(){ 
    self.item = self.undoItem 
    self.reloadInfo() 
} 

私は比較的簡単ソリューションがどうあるべきかとの多くの成功を持っていませんでした。私はSwiftとiOSの開発にはあまりにも新しいです。

+0

これらの2つの方法はどのようなクラスですか?これらのメソッドを使用して問題を示すサンプルコードで質問を更新してください。コードで実際に何が起きているのか、そして何を起こそうとしているのかを明確にします。 – rmaddy

+0

なぜ理解しにくいのか分かりません。私は、同じ参照を共有しないように、別の場所に格納できるように、initに渡されたアイテムのコピーを作成する方法を理解したいと思います。これにより私は1つに変更を加えることができ、ユーザーがそれらの変更を元に戻すことを決めた場合、リセット機能がその機能を呼び出すことができます。 – daredevil1234

+1

'Item'にコピー初期化子があることを確認し、それを使用してください。深いコピーを作成しないと、いずれかのプロパティが参照型である場合に問題が発生する可能性があります。これは、浅いコピーを作成した場合、2つの異なる 'Item'オブジェクトを持つためです。参照型メンバー変数の同じインスタンスに変換します。 –

答えて

0

は遊び場で(友人の助けを借りて)次のことを書いたようにあなたの問題はItemを定義することによって解決することができます:

protocol Copyable { 
    func copyOfValues() -> AnyObject 
} 

extension Copyable where Self: NSObject { 
    func copyOfValues() -> AnyObject{ 
     var copyOfOriginal = Self() 
     let mirror = Mirror(reflecting: self) 
     for (label, value) in mirror.children { 
      if let label = label { 
       copyOfOriginal.setValue(value, forKey: label) 
      } 
     } 

     return copyOfOriginal 
    } 
} 

class Test: NSObject, Copyable { 
    var a = 1 
    var b = 2 
} 

var test = Test() 
var copy = test.copyOfValues() as! Test 

print(dump(test)) 
print(dump(copy)) 
copy.a = 10 
print(dump(test)) 
print(dump(copy)) 

をこれは、素敵でシンプルな機能で、私のクラスインスタンスのコピーを迅速に得ることができます。素早く、それらは参照型であるため(私はあなたがそれを参照することができないかどうか分からない)、基本的に毎回オブジェクトのカスタムコピー機能を記述する必要があります。さて、私はこれを書いたので、あなたがNSObjectのサブクラスを使い、このプロトコルを使用している限り、上手くいくでしょう。

これは私のコードで必要なだけ正確に動作しました

0

スウィフト構造を使用すると、あなたの選択肢になる可能性があります。

struct Item { 
    // 
} 

Swiftの構造体は値型であり、参照ではなく値でコピーされます。上記の例ではitem1.value

struct Item { 
    var value: Int = 1 
} 

var item1 = Item() 
var item2 = item1 
item2.value = 20 

print("\(item1.value)") // 1 
print("\(item2.value)") // 20 

1であり、item2.value20あります。 次の行は、ITEM1のコピーを作成し、ITEM2に割り当て:

var item2 = item1 

このラインからitem2に変更がitem1に反映されません。

結論

struct

関連する問題