每当从数组中添加或删除元素时获取事件

Get event whenever an element added or removed from array

我有一个包含自定义对象的数组。现在我需要做的是,无论何时添加或删除元素,我都需要调用一个方法来计算 totalCost。可能吗??

class Company {
    var name: String?
    ....
    ....
    var employees[Employee] = []
    var totalCost: Float = 0
}

class Employee {
    var name: String?
    .....
    .....
    var salary: Float = 0
}

我可以选择覆盖 totalCost 的 getter 方法,我需要遍历所有员工对象来计算总成本。但我不想这样做,因为我可能有大量员工,而且每次调用此迭代都可能是一项昂贵的操作。

如有任何建议,我们将不胜感激。

您可以对数组 class 进行扩展,在其中覆盖追加、插入、删除 (atIndex)... 并添加总计的计算方法。

但是请务必重写您用于 add/remove 的所有方法(例如,如果您使用它,请不要忘记 +=!

还要考虑到,如果您更改 Employee 的薪水,您还必须计算 totalCost(此处不涉及数组操作,因此不会触发这些方法)。

您可以通过不一遍又一遍地计算所有员工来提高效率:例如追加方法:添加新员工的总数,删除方法:在覆盖方法中先减去再删除,setter 工资计算方法:总减旧,加新... 再次小心,因为如果您忘记了什么,这样可能会出错!

您可以创建只读计算 属性,如下所示:

class Employee {
    var name: String?
    var salary: Float = 0
    init(name: String, salary:Float) {
        self.name = name
        self.salary = salary
    }
}



class Company {
    var name: String?
    var employees:[Employee] = []
    var totalCost: Float  {
        return employees.map{[=10=].salary}.reduce(0){[=10=]+}
    }
}


let employee1 = Employee(name: "Steve", salary: 5000)
let employee2 = Employee(name: "Chris", salary: 7000)
let employee3 = Employee(name: "John", salary: 3000)

let company = Company()
company.name = "ACME"
company.employees = [employee1,employee2,employee3]
company.totalCost   // 15000

您可以按照此方法进行观察和通知:

在你的数组 class 中这样做:

let arrayChangedNotification = "myArrayDidChange"

class Company {
var name: String?
....
....
var employees: [Employee] = []{
didSet{
alertMe()
}
}
var totalCost: Float = 0

func alertMe() {
    let center = NSNotificationCenter.defaultCenter()
    center.postNotificationName(arrayChangedNotification, object: self)
}
}

并在您的 viewController 中添加:

func arrayDidChange(notification: NSNotification) {
 // whatever gonna happen in array change!
}

并在 viewDidLoad() 方法中将观察者添加到通知中:

let center = NSNotificationCenter.defaultCenter()
    center.addObserver( self,
        selector: "arrayDidChange:",name: arrayChangedNotification,object: nil)