2014-10-12 14 views
6

, ich würde durch die Einführung von Apple zu Swift und stieß auf solches Beispiel:Was bedeutet der Typ ((Int) -> Int) in Swift?

func makeIncrementer() -> ((Int) -> Int) { 

    func addOne(number: Int) -> Int { 
     return 1 + number 
    } 
    return addOne 

} 
var increment = makeIncrementer() 
increment(7) 

Können Sie bitte die Syntax des Rückgabetypen der Funktion makeIncrementer erklären? Ich verstehe, dass diese Funktion eine andere Funktion zurückgibt, aber die Rolle von ((Int) -> Int) in diesem Zusammenhang ist für mich noch unklar.

+0

(ein Rückgabetyp zu sein, ist nicht unmittelbar relevant, obwohl es ein interessantes Beispiel nicht bringen: es auch eine Art gewesen sein eine Variable, zB.) – user2864740

Antwort

7

Es zeigt an, dass die Funktion eine Funktion zurückgibt und zurück Funktion einen Int als Eingabeparameter und gibt auch ein Int.

Das Definieren von Funktionen innerhalb von Funktionen ist in Swift vollkommen zulässig.

2

(Int -> Int) bezeichnet einen Verschluß (oder Funktion) eine Int als Parameter genommen und eine Int zurückkehrt.

Die Syntax für einen Verschluss erklärt ist:

(parameters) -> (return_types) 

parameters eine Liste von Parametern ist der Verschluss als Eingabe und return_types ist die Liste der Werte des Verschluss kehren empfängt. Beide sind Tupel, aber bei einem Parameter oder einem Rückgabetyp kann die Klammer, die das Tupel identifiziert, weggelassen werden. So zum Beispiel ein clousure einen Parameter erwartet und einen Wert zurückgibt kann definiert werden als:

parameter -> return_type 

In Ihrem Fall:

Int -> Int 

einen Verschluss mit 1 Eingangsparameter Int Typ ist und Zurückgeben eines Int

Der Rückgabetyp ist in Klammern eingeschlossen, um deutlich zu machen, dass es sich um den Rückgabetyp handelt, aber Sie könnten auch Folgendes schreiben:

func makeIncrementer() -> Int -> Int { 

die meiner Meinung nach weniger lesbar als

func makeIncrementer() -> (Int -> Int) { 
1

Ich bin nicht genau mit der Syntax der schnellen vertraut, aber ich denke, alle Funktionen höherer Ordnung die gleiche Arbeit.makeIncrementer ist eine Funktion, die:

  • keine Parameter
  • gibt eine Funktion, die Takes:
  • gibt ein Int

Visuelle Erklärung

  • nimmt einen Int Parameter (a -> b bedeutet eine Funktion, die b) Typen a als Parameter und kehrt Typ nimmt:

     makeIncrementer -> (Int -> Int) 
             ^
              | 
              | 
              a function that takes an Int and returns an Int, 
              i.e. (addOne in your case)