2016-06-01 16 views
1

I Swift studieren, als ich auf diese kam:Funktionstyp vs Funktionen (Methoden)

var action:() -> Void = { 
    print "hi" 
} 
var someVariable: Int -> Int 

Wie ich bisher weiß, dass diese sollten Funktion Variablen vom Typ sein, die „Aktion“ a „übernimmt keine Parameter und gibt nichts zurück“ -Typ während „somevariable“ a ist „ein Int nimmt ab und gibt einen Int“ -Typ.

Also meine Frage ist: Warum nicht einfach func verwenden?

func action() { 
    print "hi" 
} 
func someVariable(a: Int) -> Int { 
    return a + 1 
} 

Sind diese beiden die gleiche Sache? Oder gibt es eine Vorliebe, wenn Code geschrieben wird, um func über Funktionstypvariablen zu verwenden oder umgekehrt? Wenn es welche gibt, wann wann?

Antwort

3

Im Fall von:

var someVariable: Int -> Int 

Sie eine Variable mit einer Methode Unterschrift erklären eine Int akzeptieren und eine Int zurück. Sie können jede Funktion zuweisen, die dieser Methodensignatur entspricht. Sie können diese Variable übergeben und sie bei Bedarf wie jede andere Variable zuweisen. Es fügt Flexibilität hinzu, wie Sie Ihre Methoden zuweisen können.

+0

Also zum Beispiel, wenn eine andere Funktion einen Parameter nimmt, kann ich "someVariable" hineingeben, da es eine "Variable" ist, während Funktionen selbst nicht herumgereicht werden können? –

+0

Anstatt eine andere Variable zu erstellen (var a = someVariable (1)), einfach den Rückgabewert einer Funktion erfassen und an eine andere Funktion übergeben? –

+2

@RayTso Was Strat bedeutet ist, dass Sie * einige * closure * zu * 'var someVariable' zuweisen können - zum Beispiel können Sie schreiben' someVariable = {a im Gegenzug ein * 2} 'und später' someVariable = {a im Gegenzug a * a} '. Mit Funktionen können Sie nicht dasselbe machen. – luk2302

1

Funktionen sind ein Sonderfall von Closures. Gemäß der Swift docs:

Globale Funktionen sind Verschlüsse, die einen Namen und erfassen nicht alle Werte haben.

Verschachtelte Funktionen sind Verschlüsse, die einen Namen haben und Werte aus ihrer umschließenden Funktion erfassen können. Closure-Ausdrücke sind unbenannte Closures, die in einer Lightweight-Syntax geschrieben sind, die Werte von ihrem umgebenden Kontext erfassen können. Swifts Closure-Ausdrücke haben einen sauberen, klaren Stil mit Optimierungen, die kurze, störungsfreie -Syntax in gängigen Szenarien unterstützen.

Als Sonderfall von Verschlüssen können Funktionen überall dort eingesetzt werden, wo ein Verschluss erforderlich ist.