[英]Why does the value of this array change when passed into a function as an argument?
[英]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
定義為類,則將其添加到數組時不會復制我們的對象。 testBook
和myBookCollection[0]
持有相同的對象。 當您更改其中一個時,另一個將受到影響。 如果添加testbook = Book()
,則testBook
現在指向內存中的其他對象,您執行的操作對myBookCollection[0]
沒有影響。
您可以將Book
從類(引用類型)更改為struct
(值類型)。 在這種情況下,當您將其添加到數組時,它將向該數組添加一個副本 ,因此您對testBook
所做的操作不會影響它。
這是WWDC的視頻,演示了您遇到的確切問題: 在Swift中使用值類型構建更好的應用程序
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.