Swift 4 Скопируйте массив объектов по значению, которые имеют массив внутри - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь понять, как работает функция copy() в Swift 4. У меня есть два класса, которые структурированы следующим образом:

class Project {
    var id: Int
    var name: String
    var team: [Person]?

    init(id: Int, name: String, team: [Person]?) {
        self.id = id
        self.name = name
        self.team = team
    }
}

class Person {
    var id: Int
    var name: String
    var project: Project?

    init(id: Int, name: String, project: Project?) {
        self.id = id
        self.name = name
        self.project = project
    }
}

В моей программе у меня есть массив проектов, и я пытаюсь создать копию значений в массиве следующим образом:

// arrProjects is some array of projects.
let projectsCopy = arrProjects.map { $0.copy() } as! [Project]

Чтобы это работало, я реализовал протокол NSCopying для обоих классов следующим образом:

extension Project: NSCopying {
    public func copy(with zone: NSZone? = nil) -> Any {
        let teamCopy = self.team?.map { $0.copy() } as! [Person]?
        return Project(id: self.id, name: self.name, team: teamCopy)
    }
}

extension Person: NSCopying {
    public func copy(with zone: NSZone? = nil) -> Any {
        let projectCopy = self.project?.copy() as! Project?
        return Person(id: self.id, name: self.name, project: projectCopy)
    }
}

Однако, когда я запускаю код и arrProjects.map { $0.copy() } запускается, приложение останавливается, как будто оно зацикливается, и в строке let teamCopy = self.team?.map { $0.copy() } as! [Person]? выдается ошибка Thread 1: EXC_BAD_ACCESS (code=2, address=0x7ffee5a61ff8).

Есть идеи, где я иду не так?

1 Ответ

0 голосов
/ 10 января 2019

Вы не должны использовать copy () внутри определения public func copy(with zone: NSZone? = nil) -> Any { Вы создаете бесконечный цикл.

extension Project: NSCopying {
    public func copy(with zone: NSZone? = nil) -> Any {
        let copy = Project(id: self.id, name: self.name, team: self.team)
        return copy
    }
}

extension Person: NSCopying {
    public func copy(with zone: NSZone? = nil) -> Any {
        let copy = Person(id: self.id, name: self.name, project: self.project)
        return copy
    }
}
...