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.
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
angeben, leiten Sie (zumindest für das System) das Tupel ab. %code%
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% Der Typ inferral behandelt
als Tupel anstelle des ersten Arguments, weil Sie nicht den 2. Parameter verwenden. %code%
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.
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).
Tags und Links swift