2016-11-04 2 views
0

In dem Buch „Swift Programming Language 3.0“, erwähnt, dass Verschlussarten umfassen:Sind Instanzmethoden Verschlüsse?

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

Verschachtelte Funktion Schließungen sind dass hat einen Namen und kann Capture-Werte aus ihrer umschließenden Funktion

Closure Ausdruck ist unbenannte Verschluss in einer leichten Syntax geschrieben, die Werte aus dem sie umgebenden Kontext erfassen

Ich habe mich nur gefragt, ob eine Funktion, die im Klassenumfang existiert, als eine Schließung zählen? Man kann diese Funktion durchaus als Argument für andere Funktionen weitergeben, aber ist es eine Schließung?

+1

Dies scheint relevant: http://stackoverflow.com/a/36576717/1226963 – rmaddy

Antwort

2

Ja! Absolut! Hier ist ein Beispiel, das die lowercased() Methode von String verwendet.

let aClosure: (String) ->() -> String = String.lowercased 


let anUpperCasedString = "A B C" 
print(anUpperCasedString) 

let aLowerCaseString = aClosure(anUpperCasedString)() 
print(aLowerCaseString) 

Sie können sehen, dass der Typ dieses Verschlusses (String) ->() -> String ist. Dies liegt daran, dass String.lowercased vollständig nicht angewendet wurde, es hat keine Ahnung, in welchem ​​Fall es ausgeführt wird.

Durch den Aufruf aClosure(anUpperCasedString) wird eine Schließung zurückgegeben, die jetzt lautet. In sie hineingebacken ist die Instanz, auf der sie operieren wird. Nur wenn Sie diese neue Schließung ohne Parameter aufrufen (()), führt sie tatsächlich den Körper lowercased() aus, operiert auf der Instanz, die Sie im vorherigen Schritt angegeben haben, und gibt Ihnen das Ergebnis String zurück.

Als Konsequenz gilt dies auch:

let aLowerCaseString = String.lowercased("QWERTY")() 

Es ist einfach macht alle oben genannten Schritte in einem inlined Schritt.

Diese Technik wird Funktion currying genannt. This post spricht mehr über diese Technik (Funktion currying), da sie auf Instanzmethoden in Swift angewendet wird.

+0

wow, Ihre Antwort ist einfach unglaublich! Danke, dass du es klar und verständlich erklärst! appreate deine Hilfe wirklich! – Thor

+0

@TonyStark Kein Problem :) – Alexander