具有包含数组的元素的数组的深层副本?
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
}
}
我正在尝试制作以下对象列表的深层副本:
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
}
}