2015-09-03 51 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) 
相關問題