Swift Language Variazioni di sintassi

Esempio

La sintassi di chiusura di base è

{ [ capture list ] ( parametri ) throws-ness -> restituisce type in body } .

Molte di queste parti possono essere omesse, quindi ci sono diversi modi equivalenti per scrivere semplici chiusure:

let addOne = { [] (x: Int) -> Int in return x + 1 }
let addOne = { [] (x: Int) -> Int in x + 1 }
let addOne = { (x: Int) -> Int in x + 1 }
let addOne = { x -> Int in x + 1 }
let addOne = { x in x + 1 }
let addOne = { $0 + 1 }

let addOneOrThrow = { [] (x: Int) throws -> Int in return x + 1 }
let addOneOrThrow = { [] (x: Int) throws -> Int in x + 1 }
let addOneOrThrow = { (x: Int) throws -> Int in x + 1 }
let addOneOrThrow = { x throws -> Int in x + 1 }
let addOneOrThrow = { x throws in x + 1 }
  • La lista di cattura può essere omessa se è vuota.
  • I parametri non hanno bisogno di annotazioni di tipo se i loro tipi possono essere dedotti.
  • Il tipo di reso non ha bisogno di essere specificato se può essere dedotto.
  • I parametri non devono essere nominati; invece possono essere indicati con $0 , $1 , $2 , ecc.
  • Se la chiusura contiene una singola espressione, il cui valore deve essere restituito, la parola chiave return può essere omessa.
  • Se la chiusura è dedotta per lanciare un errore, è scritta in un contesto che si aspetta una chiusura di lancio, o non lancia un errore, i throws possono essere omessi.
// The closure's type is unknown, so we have to specify the type of x and y.
// The output type is inferred to be Int, because the + operator for Ints returns Int.
let addInts = { (x: Int, y: Int) in x + y }

// The closure's type is specified, so we can omit the parameters' type annotations.
let addInts: (Int, Int) -> Int = { x, y in x + y }
let addInts: (Int, Int) -> Int = { $0 + $1 }