2016-12-13 9 views
0

Язык Использована 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 
    } 
} 
+0

Простейшая вещь, которую вы можете сделать, это не допускать такой ситуации. Сделайте имя постоянным ('let') или сделайте' Doctor' в 'struct'. Концепция неизменяемости очень эффективна и упрощает дизайн. – Sulthan

+0

Но мне нужно наблюдать изменения внутри массива. –

ответ

1

Просто, позволяя doctors массив быть property observer:

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!")).

+0

, но будет ли это срабатывать, если бы была изменена только собственность внутри врачей [0]? –

+0

Я знаю, что didSet будет срабатывать, если я добавлю значение для врачей [0] –

+0

@ZonilyJame didSet следует вызвать, если вы добавили нового врача или модифицировали существующего врача. –