È una funzione o una chiusura?Swift: definizione e sintassi delle funzioni e chiusure
let triple: Int -> Int = {
(number: Int) in // What is this?
let result = 3 * number
number
return result
}
triple(1)
È una funzione o una chiusura?Swift: definizione e sintassi delle funzioni e chiusure
let triple: Int -> Int = {
(number: Int) in // What is this?
let result = 3 * number
number
return result
}
triple(1)
1: È una chiusura.
Esempi:
func aFunction() ->() {
// do something
}
let aClosure:() ->() = {
// do something
}
funzioni sono in realtà un caso speciale di chiusure. È possibile scrivere una chiusura senza un nome circondando il codice con parentesi graffe ({}). Utilizzare in per separare gli argomenti e restituire il tipo dal corpo.
Estratto da: Apple Inc. "The Swift Programming Language." IBooks. https://itun.es/us/jEUH0.l
2: "in" è solo la notazione scelta per rappresentare dove terminano gli argomenti/tipo di ritorno e inizia il corpo della chiusura. Non ha nulla a che fare con inout.
Perché utilizzo la funzione e non utilizzo la chiusura o l'opposto di questo? qual è la vera differenza? –
Ciò significa vincolare la chiusura alla costante triple
che, se eseguita nell'ambito globale, è simile alla dichiarazione come funzione (vedere il commento di Eric sotto per le differenze). La riga (number: Int) in
dichiara i parametri di input alla chiusura.
In questo caso il tipo può essere lasciato fuori però dal momento che può essere dedotto dal tipo di chiusura, e dal momento che hanno una sola istruzione può essere scritto come espressione di chiusura con rendimento implicito come:
let triple: Int -> Int = { number in
3 * number
}
// or as a function
func triple(number: Int) -> Int {
return 3 * number
}
// Or as the very short
let triple: Int -> Int = { 3 * $0 }
Puoi leggere ulteriori informazioni al riguardo nel capitolo delle documentazioni ufficiali sulle chiusure.
Associare una chiusura a una variabile è simile a, ma ** non ** uguale a dichiararla come una funzione. Tre esempi di importanti differenze includono sovraccarico, valori parametrici predefiniti e generici, nessuno dei quali potrebbe supportare le chiusure vincolate. –
È vero, ho aggiornato la risposta con un puntatore a questo commento. – hallski
Swift Chiusure sono definiti come segue:
{ (parameters) -> return type in
statements
}
Così, il vostro esempio di codice viene considerato una chiusura per definizione. Tuttavia, vorrei riscrivere come segue spostando il tipo di ritorno all'interno delle parentesi graffe:
let triple = {
(number: Int) -> Int in
let result = 3 * number
number
return result
}
triple(1)
I parametri e restituire tipo inizia dopo la parentesi graffa e termina prima della a parola e il corpo della chiusura inizia dopo la parola chiave in e termina alla parentesi graffa di chiusura. Successivamente, mi sento di raccomandare di scaricare e leggere iBook da iTunes che si possono trovare al seguente indirizzo:
https://itunes.apple.com/us/book/swift-programming-language/id881256329?mt=11
Un modo facile distinguere tra le funzioni e le chiusure è,
globale Funzione: Avere un nome. Non acquisire alcun valore.
Funzione annidata: avere un nome . Cattura i valori dalla funzione di chiusura.
Chiusura: Non ha il nome come funzione. Cattura valori dai blocchi adiacenti.
Una funzione è una chiusura con un nome. La chiusura che hai fornito, ha un nome ed è quindi sia una funzione che una chiusura.
Dal sito degli sviluppatori di Apple:
funzioni globali e nidificate, come introdotto nelle funzioni, sono in realtà casi particolari di chiusure. Le chiusure prendono una delle tre forme:
Le funzioni globali sono chiusure che hanno un nome e non acquisiscono alcun valore . Le funzioni annidate sono chiusure che hanno un nome e possono acquisire i valori dalla loro funzione di chiusura. Le espressioni di chiusura sono senza nome chiusure scritte in una sintassi leggera in grado di acquisire valori da contesto circostante.
la roba prima di 'tale dicitura assegna gli ingressi alle funzioni alle variabili lì. In questo caso il 'numero' sarà assegnato al parametro di input passato a questa chiusura, che è' 1'. 'in' non è completamente correlato con' inout', che specifica il passaggio per riferimento – Jack