Глубокая копия массива с элементами, содержащими массив? - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь сделать глубокую копию списка следующих объектов:

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 { $0.title == "SampleTitle" }
}

Вышеупомянутый фильтр и copiedArray и originalArray, и я, очевидно, просто хочу изменить copiedArray.

Когда я клонирую массив следующим образом:

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

clonedArray клонируется, но clonedArray.books пуст.

Я создал расширение и следовал это суть.Как мне клонировать массив в объектах в массиве?

Я сделал небольшую площадку для визуализации проблемы, надеюсь, это поможет понять, о чем я говорю.

enter image description here

1 Ответ

0 голосов
/ 14 октября 2018

В вашем инициализаторе копирования в 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
    }
}
...