2015-04-23 5 views
8

Sono stato in sviluppo iOS per pochi mesi e desideroso di implementare nuove cose nel mio schema di programmazione.Quando utilizzare le chiusure in rapido?

Ora sto imparando chiusure e sapevo poco della sua sintassi, sapevo che poteva essere usato al posto di delegato per i callback. Così come implementato in alcuni UIViewAnimation e per l'ordinamento.

Ma in realtà voglio sapere quali sono gli usi oltre a quello.i.e dove dovremmo usare le chiusure nella nostra programmazione di base. Come noi usiamo delegato quando vogliamo inviare informazioni da bambino a genitore. Quindi qualsiasi spiegazione o breve esempio sul suo effettivo che può essere utilizzato nella nostra programmazione rapida giornaliera sarebbe utile?

Qualcuno può dirmi come questi in realtà chiusura calcola il valore

reversed = sorted(names, { (s1: String, s2: String) -> Bool in return s1 > s2 }) 

In questi esempio c'è nomi e chiusura come argomento di un method..but come fa questo calcola in realtà?

Puoi spiegare come queste opere quando passa chiusure in questo codice di animazione:

UIView.animateWithDuration(duration: NSTimeInterval, 
    animations: (() -> Void)?, 
    completion: ((Bool) -> Void)?) 

voglio davvero sapere sul flusso?

risposta

15

I due casi più comuni sono i blocchi di completamento e le funzioni di ordine superiore in Swift.

Blocchi di completamento:, ad esempio, quando si ha un'attività dispendiosa in termini di tempo, si desidera ricevere una notifica al termine dell'attività. È possibile utilizzare le chiusure per questo, invece di un delegato (o molte altre cose)

func longAction(completion:() ->()) { 
    for index in veryLargeArray { 
     // do something with veryLargeArray, which is extremely time-consuming 
    } 
    completion() // notify the caller that the longAction is finished 
} 

//Or asynch version 
func longAction(completion:() ->()) { 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 

     for elem in veryLargeArray { 
      // do something with veryLargeArray, which is extremely time-consuming 
     } 
     dispatch_async(dispatch_get_main_queue(), { 
      completion() // notify the caller that the longAction is finished 
     }) 
    } 
} 

longAction { print("work done") } 

Nell'esempio precedente, quando si ha un compito che richiede tempo, si vuole sapere quando il ciclo for finiture iterazione attraverso il molto vasta gamma. Hai inserito la chiusura { println("work done") } come parametro di input per la funzione che verrà eseguita dopo che il ciclo for ha terminato il suo lavoro e stampato "work done". E quello che è successo è che hai dato una funzione (chiusura) a longAction e lo chiami a completion, e quella funzione verrà eseguita quando chiami completion in longAction.

funzioni di ordine superiore: è possibile utilizzare le chiusure come parametri di input per le funzioni di ordine superiore, ad esempio:

let array = [1, 2, 3] 
let smallerThanTwo = array.filter { $0 < 2 } 

Con questo, è possibile filtrare i numeri che sono più piccole 2.

AGGIORNATO su come funziona sorted (probabilmente):

Quindi l'idea è che allineati passerà attraverso l'array, e confrontare due elementi consecutivi (i, i + 1) l'uno con l'altro e scambiarli, se necessario. Cosa significa "se necessario"? Hai fornito la chiusura { (s1: String, s2: String) -> Bool in return s1 > s2 }, che restituirà true se s1 è lexiographically maggiore di s2. E se tale chiusura ha restituito true, l'algoritmo sorted scambierà questi due elementi e contatterà questo con i due elementi successivi (i + 1, i + 2, se non viene raggiunta la fine dell'array). Quindi in pratica devi fornire una chiusura per sorted che dirà "quando" scambiare elementi.

+0

so un po 'di questo..puoi spiegare per favore con un esempio sul blocco di completamento? –

+0

@ copeME Ho aggiornato la mia risposta con un esempio. –

+0

@ copeME Ho aggiornato la mia risposta con un'esplosione di come probabilmente funziona. –

-2

Una chiusura è qualcosa di simile:

{ (params) -> returnType in 
    statements 
} 

Ecco alcuni motivi per cui ad usarlo da Apple doc

  • presunzione di tipi di parametri e valori di ritorno dal contesto
  • rendimenti impliciti da chiusure a singola espressione
  • Nome argomento breve
  • Trailing sintassi chiusura
+0

puoi fornirmi un buon esempio su come usare la chiusura come blocco di completamento e descriverne l'accadere? –

1
  1. solito chiusure non ha nomi in contrasto con altre funzioni. Ciò significa che possono essere utilizzati in ogni caso quando si desidera passare una porzione di codice a una funzione senza doverla inserire nel metodo denominato. L'ordinamento è l'esempio più popolare.

  2. Le chiusure possono utilizzare variabili al di fuori dei suoi confini. Cosiddetto "Capturing Values"