2017-03-02 11 views
-1

私はカスタムクラス「ブック」を持っていると私は、次のように配列内の2冊を保存しようとしています:追加しようとすると、Arrayのオブジェクトの値が変わるのはなぜですか?

class ViewController: UIViewController, UITableViewDataSource, 
{ 

      testBook.setBookTitle(title: "Harry Potter") 
      testBook.setbookPage(page: 12) 

      myBookCollection.append(testBook) 

//   testBook = Book() 

      testBook.setBookTitle(title: "testing") 
      testBook.setbookPage(page: 66) 

      myBookCollection.append(testBook) 



      for books in myBookCollection 
      { 
       print(books.getBookTitle()) 
      } 

} 

私が実行している場合は、アレイ内の上記Iの私の本がテスト」[として保存されます"、" testing "] [" Harry Potter "、" testing "]とは対照的です。

しかし、私がtestbook = Book()のコメントを外すとうまくいきます。誰かがなぜこれが事実であるか説明してもらえますか?配列は、あなたのBookインスタンスのコピーを保持していない

答えて

1

参照型と値型です。

Bookをクラスとして定義すると、それを配列に追加するとオブジェクトがコピーされません。 testBookmyBookCollection[0]は同じオブジェクトを保持しています。どちらか一方を変更すると、他方が影響を受けます。 testbook = Book()を追加すると、testBookはメモリ内の別のオブジェクトを指しているので、それを行うとmyBookCollection[0]には影響しません。

Bookをクラス(参照型)からstruct(値型)に変更できます。その場合、配列に追加するとコピーにを追加してから、testBookの作業はそれに影響しません。ここで

は、あなたが持っていた正確な問題を示しWWDCからのビデオだ:Building Better App with Value Types in Swift

+0

ちょうど理解するために、なぜstructの代わりにクラスを使用するのですか? – Nant

+0

[この質問](http://stackoverflow.com/questions/24232799/why-choose-struct-over-class-class/24232845)には、それぞれの長所と短所についての議論があります –

1

おかげで、それは単にオブジェクト(ブック)へのポインタを保持します。配列内容を変更していないタイトルとページを変更すると、testbookが指しているオブジェクトが変更されます。ただし、testBook = Book()という行のコメントを外すと、 になります。 Bookクラスの新しいインスタンスを作成し、ポインタtestbookを新しく作成したオブジェクトに設定すると、この時点からのすべての変更が新しいオブジェクトに対して行われます。 構造体を別のストーリーとして使用している場合、配列内のクラスを使用している場合、これはすべて当てはまります

+0

は、私が代わりに追加するときちょうどそれを指してのBookインスタンスのコピーを保持することができる方法はありますか? – Nant

+1

あなたの配列にポインタがあるので、アークメモリ管理システムは、それが少なくとも1つのポインタを持っている限り、実際のオブジェクトを生かしています(配列内にあれば、それは1に数えます) NSObjectをサブクラス化し、NSCopyingプロトコルに準拠させることで、常にオブジェクトをコピーすることができます – Alan

関連する問題