2017-03-02 74 views
-1

我有一個自定義類「書」,我想在一個數組保存兩本書通過以下方式:爲什麼在嘗試追加時,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()) 
      } 

} 

如果我運行陣列在上面我的圖書被存儲爲[「測試「,」測試「]而不是[」哈利波特「,」測試「]。

但是,如果我取消註釋testbook = Book()它工作正常。有人可以解釋爲什麼會出現這種情況嗎?

感謝,

回答

1

參考值類型。

如果您將Book定義爲類,則將其添加到數組時,它不會複製我們的對象。 testBookmyBookCollection[0]持有相同的對象。當你改變任何一個時,另一個會受到影響。如果添加testbook = Book(),則testBook現在指向內存中的不同對象,並且您執行的操作對myBookCollection[0]沒有影響。

可以更改Book從一個類(引用類型)到一個struct(值類型)。在這種情況下,當你將它添加到一個數組時,它將向數組添加一個副本,所以你在testBook之後不會影響它。

下面是WWDC演示你有確切的問題視頻:Building Better App with Value Types in Swift

+0

只是爲了理解:爲什麼我會使用類而不是結構呢? – Nant

+0

[這個問題](http://stackoverflow.com/questions/24232799/why-choose-struct-over-class/24232845)有一個長度討論每個人的利弊 –

1

陣列未握住你的Book實例的副本,它只是將指針對象(書)。當你改變標題和頁面時,你並沒有改變數組的內容,你正在改變testbook指向的對象。 但是,如果您取消註釋行testBook = Book()。您創建了Book類的新實例,並將指針testbook設置爲新創建的對象,並且從這一點開始的所有更改都是在新對象上完成的,這就是爲什麼它應該如其工作。 如果您在數組中使用類,如果使用的結構是另一個故事,則所有這一切都是真實的

+0

有沒有辦法,我可以拿着書實例的副本,而不是在它附加在剛指向? – Nant

+1

,因爲你的數組中有一個指針,只要arc存儲器管理系統至少有一個指向它的指針(如果它在數組中,它就是一個指針)就可以使實際對象保持活動狀態,所以不需要複製,但你總是可以通過NSObject的子類複製一個對象,並符合NSCopying協議 – Alan

相關問題