Ich habe gerade bemerkt, dass Swift eine Art Casting über Int und Double macht. Wenn ich versuche,
auszuwerten %Vor% 0.333...
wird erwartet, aber es ist tatsächlich 0.0
.
Könnte das bitte jemand erklären?
Ja, das fand ich auch ziemlich überraschend. Double
entspricht sowohl FloatLiteralConvertible
als auch IntegerLiteralConvertible
( ExpressibleByFloatLiteral
und ExpressibleByIntegerLiteral
in Swift 3). Daher a
Double
kann mit Fließkomma-Literal
oder mit einem Ganzzahl-Literal :
%Vor% (Das gleiche gilt für andere Gleitkommatypen wie Float
und
CGFloat
.)
Nun könnte es für uns alle mit einem (Objektiven-) C-Hintergrund unerwartet sein dass beide Anweisungen
%Vor% Weisen Sie der Variablen den Wert 0.25
zu. Aus dem Kontext ergibt sich das Ergebnis der
Division muss ein Double
sein, und Swift konvertiert Typen nicht implizit.
Daher muss /
muss der Gleitkommadivisionsoperator
Der Compiler erstellt also beide Argumente als Double
s aus den Literalen
"10" und "4". (Wenn 10/4
als Division von zwei ganzen Zahlen behandelt wurde
dann wäre das Ergebnis auch eine Ganzzahl, und das kann nicht zugewiesen werden
zu einem Double
.)
Beachten Sie, dass sich dies von
unterscheidet %Vor%, das eine Ganzzahl-Division durchführt und das Ergebnis in Double
umwandelt.
Double
hat einen init(_ v: Int)
-Konstruktor und daher 10/4
kann hier als Division zweier Ganzzahlen behandelt werden.
Es sieht wirklich ein bisschen komisch aus, wenn wir diese Ergebnisse zusammenfassen:
%Vor%Jetzt können wir diese Ergebnisse auf Ihren Ausdruck anwenden
%Vor% Der erste Teil (10 / 3.0)
kann nur ein Double
sein, also -
muss der Gleitkomma-Subtraktionsoperator
und somit (10 / 3)
muss auch ein Double
sein. Auch hier muss /
der Gleitkommadivisionsoperator sein, also werden 10
und 3
als Double
Konstanten behandelt.
Daher entspricht der Ausdruck
%Vor% und ergibt 0.0
. Wenn Sie den Ausdruck in
dann ist das Ergebnis 0.333...
, weil in diesem Zusammenhang 10 / 3
ist die Division von zwei ganzzahligen Konstanten, wie oben erklärt.
Tags und Links swift casting type-inference