2015-02-22 15 views
5

Vorrei utilizzare una funzione di ordine superiore rapida (mappa) per rimuovere tutte le sottoview da un dato Matrice di UIView.subviews. La lineaFunzione ordine superiore: "Impossibile richiamare 'mappa' con un elenco di argomenti di tipo '((_) -> _)'"

(cell.contentView.subviews as [UIView]).map { $0.removeFromSuperView() } 

causa l'errore "non può invocare 'mappa' con una lista di argomenti di tipo '((_) -> _)'"

Vorrei sapere qual è il compilatore ha bisogno di io a questo punto.

risposta

22

Direi che la mappa non è per questo tipo di operazione. Crea una nuova sequenza basata su altri elementi di sequenze, ma su ciò che non si desidera creare una sequenza, si desidera solo iterare attraverso di essi e applicare una funzione a loro. In fretta non esiste una funzione di ordine superiore che corrisponda a ciò che si desidera, spero che metterà presto qualcosa. Quindi il meglio che puoi fare è usare un ciclo for o scrivere la tua funzione che fa quello che vuoi.

vorrei suggerire di scrivere il proprio functon (in base a ciò foreach Scalas è):

extension Array { 

    func foreach(function: T ->()) { 
     for elem in self { 
      function(elem) 
     } 
    } 
} 

aggiornato con Swift 2,0

forEach aggiunti al SequenceType, quindi è disponibile :

(cell.contentView.subviews as [UIView]).forEach { $0.removeFromSuperview() } 
+4

Concordato. Questo è un uso improprio della mappa. La mappa non è un sostituto universale per il for-in. –

+0

Ok, d'accordo. Da qualche parte lungo la strada ho letto per non utilizzare le funzioni di ordine superiore per i loro effetti collaterali. – ff10