簡體   English   中英

為什么嘗試追加時對象的值在Array中會發生變化?

[英]Why does value of object change in Array when trying to append?

我有一個自定義類“ Book”,並且嘗試通過以下方式將兩本書保存在一個數組中:

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())
            }

}

如果我執行上述操作,則我數組中的書籍將存儲為[“ testing”,“ testing”],而不是[“ Harry Potter”,“ testing”]。

但是,如果我取消注釋testbook = Book(),則可以正常工作。 有人可以解釋為什么會這樣嗎?

謝謝,

該數組不保存您的Book實例的副本,它僅保存指向對象(書)的指針。 當您更改標題和頁面時,您並沒有更改數組內容,而是在更改testbook指向的對象。 但是,如果您取消注釋testBook = Book() 您創建一個Book類的新實例,並將指針testbook設置為新創建的對象,並且testbook的所有更改都在該新對象上完成,這就是為什么它應該工作的原因。 如果您在數組中使用類,而使用struct又是另一回事,那么所有這些都是正確的

引用與值類型。

如果您將Book定義為類,則將其添加到數組時不會復制我們的對象。 testBookmyBookCollection[0]持有相同的對象。 當您更改其中一個時,另一個將受到影響。 如果添加testbook = Book() ,則testBook現在指向內存中的其他對象,您執行的操作對myBookCollection[0]沒有影響。

您可以將Book從類(引用類型)更改為struct (值類型)。 在這種情況下,當您將其添加到數組時,它將向該數組添加一個副本 ,因此您對testBook所做的操作不會影響它。

這是WWDC的視頻,演示了您遇到的確切問題: 在Swift中使用值類型構建更好的應用程序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM