为什么在尝试追加时,对象的值会在Array中发生变化?

时间:2017-03-02 21:49:52

标签: arrays swift object

我有一个自定义类“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(),它可以正常工作。有人可以解释为什么会这样吗?

感谢,

2 个答案:

答案 0 :(得分:1)

数组不包含Book实例的副本,它只是保存指向对象(书)的指针。当您更改标题和页面时,您不会更改数组内容,而是更改testbook指向的对象。 但是,如果您取消注释行testBook = Book()。您创建了Book类的新实例,并将指针testbook设置为新创建的对象,并且此点上的所有更改都在新对象上完成,这就是它应该工作的原因。 如果您在数组中使用类,如果您使用另一个故事的结构

,那么所有这些都是正确的

答案 1 :(得分:1)

参考与价值类型。

如果将Book定义为类,则在将其添加到数组时,它不会复制我们的对象。 testBookmyBookCollection[0]持有相同的对象。当你改变任何一个时,另一个会受到影响。如果您添加testbook = Book(),那么testBook现在指向内存中的其他对象以及您执行的操作对myBookCollection[0]没有影响。

您可以将Book从类(引用类型)更改为struct(值类型)。在这种情况下,当您将其添加到数组时,它将向该数组添加一个副本,因此您对testBook执行的操作不会影响它。

以下是来自WWDC的视频,演示了您遇到的确切问题:Building Better App with Value Types in Swift