每当从数组中添加或删除元素时获取事件
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)
我有一个包含自定义对象的数组。现在我需要做的是,无论何时添加或删除元素,我都需要调用一个方法来计算 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)