Der folgende Code ist in Ordnung:
%Vor% Es gibt kein Problem bei der Rückgabe eines nicht-optionalen Int
von einer Methode mit dem Rückgabetyp des optionalen Int
.
Nun sehen wir, was passiert, wenn der Rückgabewert ein Tupel von optionalen Werten ist:
%Vor% Die Zeile return res
führt zu folgendem Fehler:
Fehler: kann die Tupelkonvertierung '(Int, Int)' nicht in '(Int ?, Int?)' ausdrücken (aka '(Optional, Optional)')
Warum lässt Swift dies nicht zu?
Ich verstehe sicherlich, warum dies ein Fehler in der anderen Richtung wäre (optional zu nicht-optional), aber warum kann ein Tupel nicht einen optionalen Wert anstelle eines optionalen akzeptieren, wenn ein Nicht-Tupel in Ordnung ist?
Ich habe Swift-Tuple zu Optionaler Zuweisung gesehen, aber das deckt nicht ab Warum können Sie die Aufgabe nicht tun, es deckt nur, wie man es löst.
Der Grund dafür ist eine Typabweichung. Betrachten Sie den folgenden Fall:
%Vor% Der Typ von myClosure
ist (Int) -> ()
, während myOtherClosure
vom Typ (Int?) -> ()
ist, was sie trotz der Ähnlichkeit der Parameter zu grundlegend unterschiedlichen Typen macht. Wenn Swift diese beiden Konstanten betrachtet, bewertet es den Typ als Ganzes, nicht die einzelnen Teile. Das gleiche passiert mit deinem Tupel; es betrachtet die Tupel-Typ-Signatur als eine ganze Einheit, ohne die Parameter zu zerlegen und zu erkennen, dass sie nicht-optionale Versionen desselben Typs sind.
Die Konvertierung von Int
nach Int?
funktioniert, weil sie vom selben Typ sind, einer ist nur optional. Der Übergang von (Int, Int)
nach (Int?, Int?)
erfolgt nicht, weil die Parameter des Tupels unterschiedlich sind, was dazu führt, dass der Gesamttyp unterschiedlich ist, daher Ihr Fehler.
Schauen Sie sich eines Ihrer Beispiele an:
%Vor% Das funktioniert, weil, obwohl die Werte nicht optionale Ganzzahlen sind, der Tupeltyp als (Int?, Int?)
markiert ist, während:
kompiliert nicht, da nun res
vom Typ (Int, Int)
ist. Ich bin kein Experte für den Swift-Compiler, aber meine Vermutung ist, dass die Art, wie das Typsystem funktioniert, nicht jeden einzelnen Teil einer Funktion oder eines Tupels dekonstruiert und erkennt, dass der entsprechende Rückgabeparameter vom selben Typ ist, nur ein optional.