A Swift Rant

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • ich verstehe aber zum Beispiel folgendes nicht

    Quellcode

    1. let resultOne: Float = 40 + 42.0
    2. let integer: Int = 40
    3. let float: Float = 42.0
    4. let resultTwo: Float = integer + float

    Zeile 1 bekommt er das hin aus der 40 (für mich ist das ein Int) zu einem Float zu casten
    wenn ich das aber in Zeile 6 machen will mit Variablen/Konstanten, dann geht das nicht hier müsste er integer doch auch einfach nur casten

    wie unterscheidet sich das?

    im Playground gibt er in Zeile 4 sogar am Ende nur 42 aus und nicht 42.0
    Ich weiß nicht immer wovon ich rede aber ich weiß das ich Recht habe. :saint:
  • nussratte schrieb:

    ich verstehe aber zum Beispiel folgendes nicht

    Quellcode

    1. let resultOne: Float = 40 + 42.0
    2. let integer: Int = 40
    3. let float: Float = 42.0
    4. let resultTwo: Float = integer + float
    Zeile 1 bekommt er das hin aus der 40 (für mich ist das ein Int) zu einem Float zu casten
    Da stehen auf der rechten Seite nur zwei Literale. Literale haben in Swift erst mal keinen Typ. Der ergibt sich erst aus dem Kontext.

    The Swift Programming Language schrieb:

    If you combine integer and floating-point literals in an expression, a type of Double will be inferred from the context:
    1. let anotherPi = 3 + 0.14159
    2. // anotherPi is also inferred to be of type Double
    The literal value of 3 has no explicit type in and of itself, and so an appropriate output type of Double is inferred from the presence of a floating-point literal as part of the addition.

    nussratte schrieb:

    wenn ich das aber in Zeile 6 machen will mit Variablen/Konstanten, dann geht das nicht hier müsste er integer doch auch einfach nur casten

    wie unterscheidet sich das?
    Der Unterschied ist, bei Variablen/Konstanten ist der Typ festgelegt und implizite Typumwandlung kennt Swift nicht.
  • zerm schrieb:

    NB: Ist bei Ada schon immer so, sogar noch strenger. Warum auch nicht, soetwas führt leicht zu Fehlern.
    Ich habe mal gelernt, dass 1+1 immer 2 ist.
    Egal ob 1+1; 1+1.0; 1 + (5/5); oder sonstwede interessante Schreibweise.

    Es ist schlimm genug (wenngleich verständlich), dass 3 / 2 == 1; 3 / 2.0 == 1.5.
    Wovor mich das beschützen soll weiß ich echt nicht.

    Ob ich mir jetzt über einen expliziten oder einen impliziten Cast schwer erkennbare Fehler in meinen Code haue ist doch komplett irrelevant.

    Beispiel gefälllig?

    C-Quellcode

    1. - (NSString *)humanReadableFileSize {
    2. NSArray *byteSuffixes = @[ @"B", @"KB", @"MB", @"GB", @"TB" ];
    3. double bytes = [self doubleValue];
    4. double humanReadableBytes = bytes;
    5. NSUInteger i = 0;
    6. for( i = 0; (int)(bytes / 1024) > 0; i++, bytes /= 1024 ) {
    7. humanReadableBytes = bytes / 1024.0;
    8. }
    9. return [NSString stringWithFormat:@"%0.1f %@", humanReadableBytes, [byteSuffixes objectAtIndex:i]];
    10. }

    Was meint ihr wohl kommt bei einem String raus, der ungefähr 1.1TB entspricht? ;)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • *g*

    Dass

    let a:Float = 3/2

    funktioniert, ist schon gefaked. Allerdings muss ich sagen, dass sich für a/b die Fehlermeldung geändert hat. Ich bekomme nämlich diejenige, die ich auch bei 3/2 erwartet hätte: "Es gibt für ein Float-Ergebnis keinen / Operator, der (Int, Int) nimmt."

    Wie schon im Vortrag mit Christian gezeigt, schließt er ja auch von Ziel auf Quelle. Das heißt, dass er bei obiger Zuweisung weiß, dass er nach etwas / suchen muss, was einen Float liefert. Das einzige, was er findet, ist offenkundig (Float) / (Float). Weshalb ich erwartet hätte, dass er bei den Argumenten den Typen anmeckert, was er für Objekte ja auch tut.

    Warum er bei Literalen gönnerhaft ist, dürfte daran liegen, dass er die "zwittrig" behandelt, also zurückschließt, dass 3 und 2 Float-Zahlen darstellen sollen. Warum auch immer.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • zerm schrieb:

    Marco Feltmann schrieb:

    Ich habe mal gelernt, dass 1+1 immer 2 ist.
    In GF(2) ist es 0. Hab ich so gelernt. Kommt halt immer darauf an, was für Zahlen Du hast.
    Es kommt doch wohl eher darauf an, was für einen Körper du hast.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?