Warum gibt der Shorthand-Argumentname $ 0 ein Tupel aller Parameter zurück?

8

Ich habe versucht, eine Variable zu definieren, die eine Schließung halten kann und mit den kurzen Argumentnamen von Swift in einige Schwierigkeiten geriet. Nimm das folgende Code-Snippet:

%Vor%

Dies gibt mir den Kompilierfehler '(String, String)' ist nicht konvertierbar zu 'String' . Wenn ich den Closure-Rückgabewert eine Zeichenfolge mit dem ersten Argumentwert ändere, bekomme ich beide Argumentwerte in einem Tupel zurück.

%Vor%

Wenn ich jedoch den Abschluss zum Drucken des zweiten Arguments ändere, wird das korrekte Argument wie erwartet gedruckt.

%Vor%

Ich habe das Gefühl, dass ich hier etwas Dummes mache, aber ich konnte keine Erklärung dafür finden, warum das passieren würde.

    
jaker 01.09.2014, 13:33
quelle

3 Antworten

9

Closures § Kurzbezeichnungen

  

Kürzel Argumentnamen

     

...   Die Anzahl und der Typ der Kurzschreibargumentnamen werden aus dem erwarteten Funktionstyp abgeleitet.

Es sieht so aus, als ob dies das erwartete Verhalten ist. Wenn Sie nur %code% angeben, leiten Sie (zumindest für das System) das Tupel ab.

Dies scheint nur ein Spezialfall der Verwendung von %code% zu sein. Zum Beispiel kann das Folgende nicht kompiliert werden.

%Vor%

Egal, wie es geändert wurde.

%Vor%     
Jeffery Thomas 01.09.2014, 14:02
quelle
2

Der Typ inferral behandelt %code% als Tupel anstelle des ersten Arguments, weil Sie nicht den 2. Parameter verwenden.

Wenn Sie nur auf den zweiten Parameter verweisen, funktioniert er korrekt:

%Vor%

Ein Beweis dafür, dass das, was ich sage, richtig ist, kommt aus dem Kommentar von 0x7fffffff:

%Vor%

was bedeutet, nimm den ersten Wert des %code% Tupels und gib es zurück.

    
Antonio 01.09.2014 13:39
quelle
0

Für die Sprache ist "mehrere Parameter" identisch mit einem einzelnen Parameter, bei dem es sich um ein Tupel handelt. Da nur verwendet wurde und nicht Void usw., nimmt der Compiler zuerst an, dass es nur einen Parameter gibt. Und diese Schätzung ist immer gültig, weil jeder Funktionstyp so angesehen werden kann, dass er genau einen Parameter hat (der %code% , ein Tupel oder anderes sein kann).

    
newacct 02.09.2014 06:59
quelle

Tags und Links