Как узнать, было ли изменено значение элемента внутри массива?

Используемый язык: Swift 2.3

Например, у меня есть модель под названием Doctor

class Doctor {
    var name = ""
    var number = 123
    init(name:String, number:String) { 
        self.name = name
        self.number = number
    }
}

И в другом классе я превратил его в массив

class SomeClass {
    var doctors:[Doctor] = [
        Doctor(name: "Matt Smith", number: 11),
        Doctor(name: "David Tennant", number: 10),
        Doctor(name: "Peter Capaldi", number: 12)
    ]
}

И тут я почему-то решаю изменить значение index #2

class SomeClass {
    ...
    // let's just say that this code was executed inside the code somewhere....
    func change() {
        doctors[2].name = "Good Dalek"
        // or
        doctors[2] = Doctor(name: "Christopher Eccleston", number: 9)
    }
    ...
}

Как я узнаю, что значение массива doctors не такое, как раньше?

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

var doctors:[Doctor] = [] {
    didSet {
        // do something if `doctors` was changed
    }
}

person Zonily Jame    schedule 13.12.2016    source источник
comment
Самое простое, что вы можете сделать, это не допускать такой ситуации. Сделайте имя константой (let) или превратите Doctor в struct. Концепция неизменяемых объектов очень эффективна и значительно упрощает дизайн.   -  person Sulthan    schedule 13.12.2016
comment
Но мне нужно наблюдать за изменениями внутри массива.   -  person Zonily Jame    schedule 13.12.2016


Ответы (1)


Просто, позволив массиву doctors быть как наблюдатель за свойствами< /а>:

class Doctor {
    var name = ""
    var number = 123
    init(name:String, number:Int) {
        self.name = name
        self.number = number
    }
}


class SomeClass {
    var doctors: [Doctor] = [
        Doctor(name: "Matt Smith", number: 11),
        Doctor(name: "David Tennant", number: 10),
        Doctor(name: "Peter Capaldi", number: 12)
        ] {
        didSet {
            print("doctros array has been modifed!")
        }
    }
}


let someClass = SomeClass()
someClass.doctors[0] = Doctor(name: "New Doctor", number: 13) // "doctros array has been modifed!"

someClass.doctors.append(Doctor(name: "Appended Doctor", number: 13)) // "doctros array has been modifed!"

someClass.doctors.remove(at: 0) // "doctros array has been modifed!"

Обратите внимание, что каждая из операций добавления, редактирования или удаления влияет на массив doctors, вызывает код didSet (print("doctros array has been modifed!")).

person Ahmad F    schedule 13.12.2016