Eigentlich hat meine Farbliste 147 Einträge. Als ich diese Fehlermeldung („expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions“) bei der ursprünglichen Liste bekommen habe, wollte ich zuerst eine binäre Suche starten, habe dann aber mit einem Eintrag (funktioniert) und danach zwei Einträgen (funktioniert nicht) angefangen. Wenn ich für die Array-Elemente den Typ Double verwende geht's auch mit der gesamten Liste. Float-Literale unterstützt Swift im Gegensatz zu anderen Sprachen nicht. Als Workaround muss ich also entweder Double verwenden, die Divisionen durch ihr jeweiliges Ergebnis ersetzen oder jeden Double-Ausdruck auf Float casten. Letzteres erhöht die Lesbarkeit natürlich ungemein.
Was sieht man nun an diesem Beispiel?
Was sieht man nun an diesem Beispiel?
- Type Inference ist eine recht aufwändige Geschichte. Schon kleine und selbst regelmäßige Ausdrücke können den Compiler ins Schwitzen bringen. Der 6.3beta-Compiler hängt sich damit sogar auf...
- Type Inference ist Mist (siehe 1.): Anstatt das die linke Seite vorschreibt, was der Compiler auf der rechten Seite zu tun hat (Double-Ausdrücke in Floats konvertieren), versucht der Compiler krampfhaft selber herauszufinden, welchen Typ die rechte Seite hat und scheitert schon an einer geringen Komplexität. Der gesamte Baum dieses Ausdrucks dürfte so ca. 25 Knoten enthalten.
- Static Typing ist Mist: Ich habe als Workaround den Typ [String:[Double]] verwendet. Wozu brauche ich dann aber Static Typing, wenn ich die Typen verwenden muss, die der Compiler lieber mag.
„Meine Komplikation hatte eine Komplikation.“