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:
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.
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%Möglicherweise ein Compilerfehler. Ein Radar archiviert?
Da all Ihre Argumente sowieso vom selben Typ sind, können Sie genauso gut [Int]
Argumente verwenden:
sumArray([1, 2, 3, 4, 5])
gibt das korrekte Ergebnis zurück.
Tags und Links swift