Zugriff auf die Anzahl der Parameter in einer Schließung in Swift

9

Angenommen, ich habe eine Funktion:

%Vor%

Später rufe ich dann mit:

%Vor%

Ist es möglich, die Anzahl von closureArgs in test zu erhalten? Das Ziel wäre eine Überladung. Zum Beispiel könnte test Code enthalten wie:

%Vor%

Zur Klarstellung - ich meine, ich muss auf die Länge von closureArgs zugreifen INSIDE test , aber OUTSIDE closure

    
wlingke 13.01.2015, 16:14
quelle

3 Antworten

2
  

Ist es möglich, die Anzahl der im Test bereitgestellten closureArgs zu erhalten?

Die kurze Antwort

Nein.

Etwas längere Antwort

Nein, ist es nicht. Hier ist warum:

Die Funktion nimmt eine Schließung vor, da es sich um ein Argument handelt, das definitionsgemäß eine variierte Anzahl von Argumenten erfordert. Es gibt keinen möglichen Weg für jemanden, der die Funktion aufruft, um zu bestimmen, wie viele Argumente die Schließung im Voraus brauchen sollte. Zum Beispiel, wenn ich Ihre Funktion aufrufen würde, könnte es so aussehen:

%Vor%

Wie Sie feststellen werden, definiere ich die Anzahl der Argumente nirgends, weil die Anzahl der Argumente nur beim Aufruf der Closure angegeben wird. Dann kann die Nummer innerhalb bestimmt oder möglicherweise zurückgegeben werden.

Grundsätzlich wird die Closure innerhalb des Tests aufgerufen, so dass nur Sie, der Aufrufer, weiß, wie viele Argumente er benötigt. Wer diese Funktion nutzt, hat keine Kontrolle darüber.

    
Logan 13.01.2015, 20:37
quelle
1

Der einzige Weg, den ich mir vorstellen kann, ist, dass die Closure ein Tupel zurückgibt, das die Anzahl der Argumente und eine Funktion enthält, die die Antwort liefert, wie folgt:

%Vor%

So etwas funktioniert vielleicht, aber ich bin nicht an einem Ort, wo ich es testen kann.

Edit: Ich versuche das jetzt zu testen, und es ist in der Nähe, aber es funktioniert noch nicht ...

Edit: Okay, das funktioniert, aber vielleicht nicht so, wie du es willst ...

%Vor%

Jetzt wird test(sum(2, 4)) drucken, dass die Anzahl der Argumente 2 und das Ergebnis 6 ist.

Die Sache ist, wenn Sie eine Schließung übergeben, die bereits Argumente geliefert hat (und es braucht Argumente, um zu wissen, wie man die Anzahl berechnet), dann sind Sie Closure-Funktion bereits zu einem Ergebnis ausgewertet. Also muss die Schließung die Anzahl der Argumente zurückgeben, die sie verwendet hat, um das Ergebnis zusammen mit dem Ergebnis zu berechnen. Dann können Sie in test sowohl mit der Anzahl der Argumente als auch mit dem Ergebnis arbeiten.

Ich weiß nicht ... es ist schwer zu wissen, was genau Sie suchen, weil ich nicht sicher bin, welche Art von Logik Sie implementieren müssen, wenn Sie die Anzahl der Argumente kennen ...

Bearbeiten: Tut mir leid, ich mache weiter und weiter, aber es scheint, als ob Sie wissen, wie viele Argumente enthalten sein werden, wenn Sie Test aufrufen, oder? Ich meine, in Ihrem Beispiel haben Sie 4 Argumente angegeben:

%Vor%

(Obwohl Sie das wirklich neu schreiben müssen als:

%Vor%

... weil sich Variable Parameter als Array übergeben werden ...)

Wenn Sie also wissen, wie viele Argumente in der Closure enthalten sein werden, wenn Sie sie zum Test übergeben, fügen Sie einfach die Anzahl der Argumente als Parameter in den Test ein:

%Vor%

Wenn Sie jetzt test aufrufen, übergeben Sie einfach die Anzahl der Argumente als Int :

%Vor%

Mit anderen Worten: Sie wissen immer, wie viele Argumente Sie an die Schließung übergeben, wenn Sie sie übergeben . Wenn Sie test wissen wollen, fügen Sie das als Parameter hinzu.

    
Aaron Rasmussen 13.01.2015 17:49
quelle
0

Die Antwort geht darauf zurück, wie Swift Argumente an varargs-Funktionen übergibt, die wie ein Array sind. Im Allgemeinen die Funktionsdefinition:

%Vor%

Ist syntaktischer Zucker, der für einen einfacheren Aufruf sorgt, für die Deklaration:

%Vor%

In Ihrem Fall wird Ihre Schließung wie folgt aufgerufen:

%Vor%

Dann könnten Sie innerhalb Ihrer Schließung die Anzahl der Argumente mit:

erhalten %Vor%     
David Berry 13.01.2015 16:27
quelle

Tags und Links