2015-09-03 54 views
1

我有一个包含自定义对象的数组。现在我需要做的是什么时候添加或删除一个元素,我需要一个方法来调用totalCost。可能吗??每当添加或从数组中删除元素时都会收到事件

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

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

我有一个选项覆盖的totalCost,我需要经过全体员工对象来计算TOTALCOST getter方法。但我不想这样做,因为我可能拥有大量的员工,并且在每次调用时,这种迭代都可能是一项昂贵的操作。

任何建议将是可观的。

回答

2

您可以创建一个只读的计算特性如下:

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{$0.salary}.reduce(0){$0+$1} 
    } 
} 


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 
+1

感谢兄弟..这正是我一直在寻找。 –

+0

@TapasPal欢迎您 –

+0

你能解释一下:return employees.map {$ 0.salary} .reduce(0){$ 0 + $ 1}是有效的还是指向一个解释这个问题的网站。 thx – Glenn

0

您可以对Array类进行扩展,在其中覆盖append,insert,remove(atIndex),...并为总数添加计算方法。

务必但是重写您使用添加/删除所有的方法(例如,不要忘记+ =,如果你使用!

还要考虑到,如果你改变一个雇员,你还的工资必须计算totalCost(这里没有涉及数组操作,所以它不会触发这些方法)

您可以通过不重复计算所有员工来提高效率:例如append方法:将总数新员工,删除方法:在你的覆写方法首先删除之前删除,工资的setter方法:从总减去旧,总共增加新... 再次要小心,因为你可以如果你忘记了一些东西,就会这样出错!

0

你可以按照这个方法,以使观察者和通知:在你的数组类

做到这一点:

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) 
相关问题