2014-11-20 16 views
8

Desideravo ricevere una notifica quando un elemento veniva aggiunto/rimosso da un array. Se noi non stiamo parlando di array, ad esempio per essere informati quando una stringa è cambiato, c'è una buona soluzione in rapida:Ricevi una notifica quando elemento aggiunto/rimosso nell'array

private var privateWord: String? 
var word: String? { 
    get { 
     return privateWord 
    } 
    set { 
     if newValue != "" { 
      notifyThatWordIsChanged() 
     } else { 
      notifyThatWordIsEmpty() 
     } 
     privateWord = newValue 
    } 
} 

Possiamo ottenere un risultato simile, quando ho aggiungere/rimuovere un elemento ad un array?

risposta

4

È possibile creare proxy come classe/struct che avrà la stessa interfaccia dell'array, archivierà l'array standard sotto le scene e agirà per conto dell'array del negozio. Ecco piccolo esempio:

struct ArrayProxy<T> { 
    var array: [T] = [] 

    mutating func append(newElement: T) { 
     self.array.append(newElement) 
     print("Element added") 
    } 

    mutating func removeAtIndex(index: Int) { 
     print("Removed object \(self.array[index]) at index \(index)") 
     self.array.removeAtIndex(index) 
    } 

    subscript(index: Int) -> T { 
     set { 
      print("Set object from \(self.array[index]) to \(newValue) at index \(index)") 
      self.array[index] = newValue 
     } 
     get { 
      return self.array[index] 
     } 
    } 
} 

var a = ArrayProxy<Int>() 
a.append(1) 
+0

Questa è una buona soluzione - tuttavia si deve tener presente che tutti gli altri metodi di matrice (come carta, ordinare, ecc) e le proprietà non sono disponibili meno avvolto manualmente in modo simile – Antonio

+1

@Antonio Sì, ma credo che sia facile accedere alla matrice sottostante. 'a.array = a.array.map {...}' – Kirsteins

+0

Sì, volevo solo sottolineare che non è un vero 'array ', e non è * come * un' array (il che significa che non puoi passare a funzioni che prevedono un'istanza di un array). La mia non è una critica però - solo un chiarimento. L'idea è buona, ma ovviamente non è una soluzione per tutti i casi – Antonio

Problemi correlati