Warum kann ich .reduce () nicht in einem einlinigen Swift-Closure mit variadischem, anonymem Argument verwenden?

9

Die erste Schließung funktioniert. Sobald ich jedoch die Dummy-Zuweisung herausnehme, funktioniert die Schließung nicht mehr (addUpClosureRedFlagged). Wer weiß warum?

%Vor%     
Roelf 26.02.2016, 09:40
quelle

3 Antworten

2

Ab dem aktuellen Swift (2.1) kann sich der Typschluss von Verschlüssen etwas seltsam verhalten, wenn er nur eine einzelne Zeile enthält, siehe z. dieses etwas verwandte Problem ; erwartete explizite Einbeziehung der Signatur des Funktionstyps in den Abschluss.

Diese (Compiler) "Bug" / Closure-Einschränkung ist (zumindest) sowohl für Variadiac als auch inout Argumente vorhanden:

%Vor%

Dies kann vermieden werden, indem die Funktion explizit eingefügt wird: s type-Signatur in die Closure oder any -Anweisung vor der return-Anweisung (so dass die Closure mehr als eine einzige Zeile enthält) .

%Vor%

Warum? Ich habe "Bug" oben geschrieben, aber vielleicht mehr von einer aktuellen Beschränkung in der Typinferenz von Closures durch den Compiler; wie Pradeep K in seiner Antwort schreibt, liegt dies höchstwahrscheinlich an einigen Komplikationen des Swift-Compilers, die in diesen Fällen fehlschlagen.

    
dfri 26.02.2016 10:24
quelle
1

Das liegt wahrscheinlich an einigen Optimierungen, die der Compiler macht, wenn er an einer Zeile Verschlüsse arbeitet. Wenn Sie die Abschlussargumente nach ihrem Typ explizit akzeptieren, benötigen Sie keine Dummy-Zeile.

%Vor%

Es geht mehr darum, wie man mit einer Linie umgeht.

Für z.B. Art dieser Schließung ist () - & gt; Int. Da es sich um einen Ein-Zeilen-Abschluss handelt, wird der Rückgabewert dieser einen Zeile als Rückgabewert des Abschlusses behandelt, der in diesem Fall Int ist. Da es keine Argumente benötigt, ist es (). Daher ist type () - & gt; Int

%Vor%

Aber sobald Sie die Dummy-Zeile hinzufügen, wird sie vom Typ () - & gt; (), ein Abschluss, der keine Argumente akzeptiert und keinen Wert zurückgibt.

%Vor%

In Ihrem Fall ist die Ein-Zeilen-Schließung vom Typ (_) - & gt; Int, während der Typ (Int ...) - & gt; Int ist. Sie können dies lösen, indem Sie den Typ der Ein-Zeilen-Schließung nicht explizit definieren Ermöglichen, dass der Compiler den Typ ableitet.

%Vor%     
Pradeep K 26.02.2016 10:14
quelle
0

Möglicherweise ein Compilerfehler. Ein Radar archiviert?

Da all Ihre Argumente sowieso vom selben Typ sind, können Sie genauso gut [Int] Argumente verwenden:

%Vor%

sumArray([1, 2, 3, 4, 5]) gibt das korrekte Ergebnis zurück.

    
Joris Kluivers 26.02.2016 10:24
quelle

Tags und Links