【问题标题】:How do I know if a value of an element inside an array was changed?如何知道数组中元素的值是否已更改?
【发布时间】:2017-04-28 08:31:18
【问题描述】:

使用的语言: 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数组的值和以前不一样了?

我知道filtersort 函数。我也知道如何使用didSet 这样我就可以做到这一点

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

【问题讨论】:

  • 您能做的最简单的事情就是不允许出现这种情况。将名称设为常量 (let) 或将 Doctor 设为 struct。不可变的概念非常强大,它大大简化了设计。
  • 但是我需要观察数组内部的变化。

标签: arrays swift valuechangelistener


【解决方案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],didSet 将触发
  • @ZonilyJame didSet 如果您添加了新医生或修改了现有医生,则应调用。
  • 这似乎是一种方法。如果我想修改一个对象,我只需在所述索引处将其删除,然后在所述索引处插入。工作,但不是我想象的工作方式哈哈
  • @ZonilyJame 您可能还想查看this question 及其答案以观察数组中的特定元素。
猜你喜欢
  • 2014-02-14
  • 1970-01-01
  • 2021-05-24
  • 2015-03-28
  • 2017-03-23
  • 1970-01-01
  • 2021-03-31
  • 2011-01-26
相关资源
最近更新 更多