我有一个自定义类“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())
}
}
如果我运行上述内容,我的数组中的书籍将存储为[“测试”,“测试”],而不是[“哈利波特”,“测试”]。
但是,如果我取消注释testbook = Book(),它可以正常工作。有人可以解释为什么会这样吗?
感谢,
答案 0 :(得分:1)
数组不包含Book
实例的副本,它只是保存指向对象(书)的指针。当您更改标题和页面时,您不会更改数组内容,而是更改testbook
指向的对象。
但是,如果您取消注释行testBook = Book()
。您创建了Book
类的新实例,并将指针testbook
设置为新创建的对象,并且此点上的所有更改都在新对象上完成,这就是它应该工作的原因。
如果您在数组中使用类,如果您使用另一个故事的结构
答案 1 :(得分:1)
参考与价值类型。
如果将Book
定义为类,则在将其添加到数组时,它不会复制我们的对象。 testBook
和myBookCollection[0]
持有相同的对象。当你改变任何一个时,另一个会受到影响。如果您添加testbook = Book()
,那么testBook
现在指向内存中的其他对象以及您执行的操作对myBookCollection[0]
没有影响。
您可以将Book
从类(引用类型)更改为struct
(值类型)。在这种情况下,当您将其添加到数组时,它将向该数组添加一个副本,因此您对testBook
执行的操作不会影响它。
以下是来自WWDC的视频,演示了您遇到的确切问题:Building Better App with Value Types in Swift