Schneller Kompilierungsfehler - Der Ausdruck war zu komplex, um in angemessener Zeit gelöst zu werden

9

Ich mache einen sehr einfachen Rechner und bekomme einen wirklich komischen Fehler bei der Kompilierung. Ich erhalte den folgenden Fehler in meiner CalculatorBrain -Klasse:

  

Der Ausdruck war zu komplex, um in angemessener Zeit gelöst zu werden; Ziehen Sie in Betracht, den Ausdruck in verschiedene Unterausdrücke aufzuteilen

Hier ist der Code, der den Fehler erzeugt hat

%Vor%

Das Seltsame ist, dass wenn ich folgendes entferne:

%Vor%

Der Code wird kompiliert, andernfalls wird der Fehler ausgegeben.

Eine andere seltsame Sache ist, wenn ich diese zu:

ändere %Vor%

Der Code kompiliert und wirft den Fehler nicht.

Ich bin irgendwie verwirrt, warum es funktioniert, wenn die Operatoren * und / und nicht - und +

verwendet werden

Falls Sie sich fragen, wie Operation implementiert ist, hier ist es:

%Vor%

Ich verwende Swift Version 2.2 auf Xcode Version 7.3.1

    
breaktop 18.05.2016, 17:02
quelle

4 Antworten

5

Es hat etwas mit Typinferenz zu tun. Siehe diese Antwort für eine allgemeinere Diskussion.

In Ihrem speziellen Fall ist es die Typinferenz, die in den Closures stattfindet, die den Compiler Probleme verursacht. Ich glaube, das ist der Grund, warum der Compiler in der Lage ist, Dinge zu lösen, wenn Sie in Ihren Closure-Ausdrücken spezifische Typanmerkungen angeben.

Ich würde empfehlen, Ihre Schließungen in externen Konstanten zu speichern:

%Vor%

Dann verwenden Sie diese Konstanten in Ihrem operations Wörterbuch:

%Vor%

Das gibt dem Compiler, was es braucht, um alles zu lösen, und es ist auch ein bisschen klarer (denke ich).

EDIT: Nachdem ich das gepostet habe, habe ich festgestellt, dass es eine noch prägnantere Möglichkeit gibt, die Closures zu schreiben:

%Vor%

Das ist noch klarer (denke ich).

Einige andere Optionen, die den Compiler befriedigen und einen Teil der Duplizierung von Code reduzieren, umfassen das Erstellen eines Arrays von binären Operationen:

%Vor%

Dann greifen Sie auf sie nach Index zu:

%Vor%

Oder ein typealias erstellen:

%Vor%

Diese reduzieren etwas von der Ausführlichkeit, aber wie auch immer Sie es tun, ich denke, Sie müssen bestimmte Typ-Anmerkungen irgendwo verwenden, um den Compiler zu befriedigen.

    
Aaron Rasmussen 18.05.2016, 17:18
quelle
1

Hier ist ein Workaround, der weniger ausführlich erscheint:

%Vor%

Ich kam zu diesem Problem, übrigens (wie erwarte Breaktop tat), von Paul Hegarty Online-Kurs aus Stanford auf IOS-Entwicklung mit Swift: Ссылка .

Vermutlich ist das ein Fehler im Swift-Compiler.

    
Bill Mitchell 30.06.2016 04:17
quelle
0

Obwohl dies etwas ausführlicher war, funktionierte dies, während ich nicht zusätzlichen Code außerhalb des Operationswörterbuchs hinzufügen musste:

%Vor%

Es bringt nur das super-super-Swift-Inferenz-Ding ein paar Schritte zurück, so dass der Compiler nicht so viel arbeiten muss.

    
Nabha 02.07.2016 19:49
quelle
0
%Vor%

Das ist meine Version. Ich kann die Fehler im Editor loswerden, indem ich einfach rebuilding / running laufe, was eine neue und genauere Kompilierung erzwingt als die, die im Editor verfügbar ist. Und wenn ich alle "Operation" entfernen -

%Vor%

... es scheint zu viel Typ-Inferenz zu geben, und ich kann mich nicht aus dem Fehler heraus kompilieren. Lustige Sache, wenn ich nur ein paar der enum "Operation" Artklärungen (& amp; nicht alle) entferne, funktioniert es noch. Also ja, ein Fehler.

    
michaelI 07.03.2017 20:39
quelle