2014-06-10 10 views
7

È 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) 
+3

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

risposta

9

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.

+2

Perché utilizzo la funzione e non utilizzo la chiusura o l'opposto di questo? qual è la vera differenza? –

5

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.

https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/Closures.html

+3

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. –

+0

È vero, ho aggiornato la risposta con un puntatore a questo commento. – hallski

4

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

3

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.

3

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.

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html