2015-09-03 2 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. Но я не хочу этого делать, потому что у меня может быть огромное количество сотрудников, и при каждом вызове эта итерация может быть дорогостоящей операцией.

Любое предложение будет заметным.

ответ

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, где вы переопределите добавление, вставку, удаление (atIndex) и ... и добавьте метод расчета для общего числа.

Убедитесь, однако, чтобы переопределить все методы, которые используются для добавления/удаления (например, не забудьте + =, если вы используете это!

также принимать во внимание, что если вы изменяете зарплату сотрудника Вы также должен вычислять totalCost (здесь не задействованы массивные операции, поэтому они не будут запускать эти методы).

Вы можете сделать вещи намного эффективнее, не вычисляя ВСЕ сотрудников снова и снова: например, метод добавления: добавьте общее количество новый сотрудник, метод удаления: в вашем методе переопределения сначала вычесть перед удалением, метод 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) 
Смежные вопросы