![](/img/trans.png)
[英]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.