具有包含数组的元素的数组的深层副本?

Deep copy of array with elements containing an array?

我正在尝试制作以下对象列表的深层副本:

struct Book {
    var title: String
    var author: String
    var pages: Int
}

struct BookShelf {
    var number: Int
}

class BookShelfViewModel {
    var bookShelf: BookShelf

    var number: Int
    var books: [BookViewModel]?

    init(bookShelf: BookShelf) {
        self.bookShelf = bookShelf

        self.number = bookShelf.number
    }

    required init(original: BookShelfViewModel) {
        self.bookShelf = original.bookShelf

        self.number = original.number
    }
}

class BookViewModel {
    var book: Book

    var title: String
    var author: String
    var pages: Int

    init(book: Book) {
        self.book = book

        self.title = book.title
        self.author = book.author
        self.pages = book.pages
    }

    required init(original: BookViewModel) {
        self.book = original.book

        self.title = original.title
        self.author = original.author
        self.pages = original.pages
    }
}

BookShelf 的书籍在 BookShelfViewModel 中获取。

如果我去:

var copiedArray = originalArray

for bs in copiedArray {
   bs.books = bs.books.filter { [=11=].title == "SampleTitle" }
}

上面的过滤了copiedArray 和originalArray,我显然只想改变copiedArray。

当我像这样克隆数组时:

var originalArray = [BookShelfViewModel]()
... // Fill the array
var clonedArray = originalArray.clone()

clonedArray 已克隆,但 clonedArray.books 为空。

我已经创建了扩展并遵循了 this 要点。如何克隆数组中对象中的数组?

我做了一个快速的游乐场来可视化问题,希望它有助于理解我在说什么。

BookShelfViewModel 中的复制初始化程序中,您实际上并没有克隆 books 数组。您需要将 self.books = original.books?.clone() 添加到 required init(original: BookShelfViewModel)

class BookShelfViewModel: Copying {
    var bookShelf: BookShelf

    var number: Int
    var books: [BookViewModel]?

    init(bookShelf: BookShelf) {
        self.bookShelf = bookShelf

        self.number = bookShelf.number
    }

    required init(original: BookShelfViewModel) {
        self.bookShelf = original.bookShelf
        self.books = original.books?.clone()
        self.number = original.number
    }
}