代码之家  ›  专栏  ›  技术社区  ›  Recusiwe

包含数组元素的数组的深度副本?

  •  0
  • Recusiwe  · 技术社区  · 6 年前

    我正在尝试对以下对象的列表进行深度复制:

    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
        }
    }
    

    书架上的书在书架模型里取。

    如果我喜欢:

    var copiedArray = originalArray
    
    for bs in copiedArray {
       bs.books = bs.books.filter { $0.title == "SampleTitle" }
    }
    

    当我像这样克隆阵列时:

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

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

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

    我做了一个简单的练习来形象化这个问题,希望它能帮助理解我在说什么。

    enter image description here

    1 回复  |  直到 6 年前
        1
  •  1
  •   Paulw11    6 年前

    在你的复制初始化器中 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
        }
    }