Der Compiler kann diesen Ausdruck nicht schnell überprüfen.


74

Nach dem Aktualisieren von xCode erhalte ich diesen Fehler in meinem Code:

Der Compiler ist nicht in der Lage, diesen Ausdruck in angemessener Zeit zu überprüfen. Versuchen Sie, den Ausdruck in verschiedene Unterausdrücke aufzuteilen

Der Code :

//check popup in window frame

let spaceFromLeftSide = cutOutViewX.constant + cutOutViewWidth.constant/2 - (options.textWidth + padding*2)/2

if spaceFromLeftSide < 0{

    if options.side == .bottom {
        messageRightSpaceFromBottomDot.constant -= spaceFromLeftSide - padding
    }
    else if options.side == .top{
        messageRightSpaceFromTopDot.constant += spaceFromLeftSide - padding
    }
}

let spaceFromRightSide = cutOutViewX.constant + cutOutViewWidth.constant/2 + (options.textWidth + padding*2)/2

if spaceFromRightSide > targetView.frame.size.width{

    if options.side == .bottom {
        messageRightSpaceFromBottomDot.constant -= spaceFromRightSide - ( targetView.frame.size.width )
    }
    else if options.side == .top{
        messageRightSpaceFromTopDot.constant += spaceFromRightSide - ( targetView.frame.size.width )
    }
}

Fehler in der Zeile:

let spaceFromRightSide = cutOutViewX.constant + cutOutViewWidth.constant/2 + (options.textWidth + padding*2)/2

Wie kann man das beheben?


Sind einige der Werte in diesem Code berechnete Werte? zB options.textWidth? Sie können versuchen, die Klasse für jede Variable anzugeben, anstatt sich auf Typinferenz zu verlassen. zBlet spaceFromLeftSide: CGFloat =
Ashley Mills

1
In diesem Fall verwendet ein Prozess namens SourceKitService mehr als 13 GB Speicher auf meinem 8 GB-Computer. Normalerweise verbraucht es etwas mehr als 300 MB. Es scheint, dass einige Ausdrücke Speicherverluste im Erstellungsprozess verursachen.
Gerd Castan

2
Ich muss zugeben, dass ich meine Augen verdreht habe, als ich diesen Fehler sah
Brad Thomas

Hier ist ein weiteres lächerliches Beispiel: return
user33775

Geben Sie Speicher frei und der Fehler verschwindet! :)
Gope

Antworten:


88

Der Compiler ist nicht in der Lage, diesen Ausdruck in angemessener Zeit zu überprüfen. Versuchen Sie, den Ausdruck in verschiedene Unterausdrücke aufzuteilen

Dieser Fehler tritt auf, wenn der schnelle Compiler die Ausdrucksberechnung für langwierig hält. Weitere Details finden Sie hier

Um dies zu beheben, müssen Sie Ihren Ausdruck nur in kleinere Teile zerlegen. So wie:

let cutOutxOrigin = 3 * cutOutViewX.constant / 2
let actualPadding = (options.textWidth + padding * 2) / 2

let spaceFromRightSide = cutOutxOrigin + actualPadding

Ich habe das schon einmal gesehen und nicht verstanden, warum und am Ende Code einfacher gemacht. Diese Antwort machte die Dinge klar. Vielen Dank.
Beshio

75
Hat funktioniert! Ich hasse XCode jeden Tag mehr und mehr ... schlechte IDE!
Pelanes

5
@ Pelanes Ich bin nicht hier, um XCode zu verteidigen, aber dies wird nicht durch die IDE verursacht, sondern durch den Compiler ...
Greg Hilston

68
Ich sehe auch diesen Compilerfehler und als Entwickler seit über 30 Jahren ist das lächerlich. Unsere Aufgabe als Entwickler im Jahr 2019 ist es also, ... den Compiler nicht zu hart arbeiten zu lassen? Seit über einem halben Jahrhundert analysieren Compiler Ausdrücke, die weitaus komplexer sind. Dies erzwingt den Codierungsstil über einen Compilerfehler, was falsch ist.
Dan

27
Ich bin ein erfahrener C # - und Java-Entwickler und steige in die Swift-Entwicklung ein ... und ich bin gerade auf dieses Problem gestoßen. Ernsthaft? Ich benutze nur print ("meine Werte sind" + self.something1 + "," + ... + "," + self.something6). Und das ist zu viel für den Compiler? Ich habe eine Liste mit 100 Variablen in c # ausgespuckt und der Compiler hat nicht einmal geblinkt. Dies ist ein Witz einer Sprache.
Jo Phul

11

Ich habe ein ähnliches Problem mit einem anderen Szenario gehabt

Ich habe versucht, ein Array von Zeichenfolgen zu erstellen

let selectedData = [
        (data?.nose?.stuffyNose) ?? "",
        (data?.nose?.sinusProblems) ?? "",
        (data?.nose?.hayFever) ?? "",
        (data?.nose?.sneezingAttacks) ?? "",
        (data?.nose?.excessiveMucusFormation) ?? ""
] 

Ich habe bereits Brackets () hinzugefügt, aber es hat immer noch nicht funktioniert.


Um dies zu beheben, habe ich Typ hinzugefügt [String]

let selectedData:[String] = [
        (data?.nose?.stuffyNose) ?? "",
        (data?.nose?.sinusProblems) ?? "",
        (data?.nose?.hayFever) ?? "",
        (data?.nose?.sneezingAttacks) ?? "",
        (data?.nose?.excessiveMucusFormation) ?? ""
] 

Ich hoffe, es ist hilfreich für jemanden, der vor dem gleichen Problem steht


9

Versuchen Sie einfach, den Ausdruck in mehrere einfachere Unterausdrücke aufzuteilen. Z.B:

let halfOfViewWidth = cutOutViewWidth.constant / 2
let textWidthAndPadding = options.textWidth + (padding * 2)
let spaceFromRightSide = cutOutViewX.constant + halfOfViewWidth + (textWidthAndPadding / 2)

BEARBEITEN

Ich habe festgestellt, dass ich diesen Fehlertyp auch durch explizite Typkonvertierungen beheben konnte (z. B. anstatt mich auf den Compiler zu verlassen, um daraus zu schließen, dass ich durch Multiplizieren von a CGFloatmit einem, zu dem Intes führen sollte CGFloat, das explizit in konvertiert Inthabe CGFloat). Das Problem scheint tatsächlich in Typen und automatischer Typinferenz und -prüfung zu liegen. Während das Aufteilen des komplexen Ausdrucks in kleinere Teile für die Lesbarkeit sehr nützlich sein kann, können Sie das Problem lösen, indem Sie die Typen explizit angeben (die Fehlermeldung besagt im Grunde, dass der Compiler die Typprüfung nicht durchführen kann - Sie können ihm also helfen Bereitstellung expliziter Typen, wo immer dies möglich ist).


3

Also habe ich diese Art von Ausdruck:

return (50 + textHeight) + (dateTextHeight + 16) + (5 + 8) + (16 + 20)

Ich wusste, dass ich diesen Ausdruck aufschlüsseln oder verkürzen musste, um den Fehler zu beseitigen. Wie vielleicht:

return (50 + textHeight) + (dateTextHeight + 16) + 49

Obwohl dies wahr genug ist, hat es dem Compiler geholfen, seine Arbeit zu erledigen. Die Hauptursache für den Fehler ist das optionale Int textHeight. Ich denke, egal wie lange Ihr Ausdruck dauert, er sollte kompilierbar sein.


3

Ich hatte diesen Fehler, als ich versehentlich ein optionales in einen Ausdruck gemischt habe. Nach dem gewaltsamen Auspacken verschwand der Fehler.

let a : String = "A" 
let b : String = "B" 
let c = letterDictionary["C"]

let imageName : String = a + b + c //error 
let imageName : String = a + b + c! //no error 

Vielen Dank. Dies maskierte tatsächlich den zugrunde liegenden Fehler. In meinem Fall versuche ich, ein Selbstprotokoll zu durchlaufen.
Dirk Bester

2

Ich sehe dieses Problem ziemlich regelmäßig, wenn ich mit SwiftUI arbeite, und es war immer das Ergebnis eines Syntaxfehlers. Ich verwende derzeit Xcode 11.4.1 und dies galt für frühere Versionen, die SwiftUI unterstützen.

Zum Beispiel habe ich gerade 50 Minuten mit diesem Fehler gebrannt, weil ich den Namen eines Funktionsparameters in einer anderen Datei geändert hatte. Der Compiler hat diesen Fehler in einer SwiftUI-Datei gemeldet, die völlig unberührt blieb, außer dass die Funktion ohne den geänderten Parameternamen aufgerufen wurde. Anstatt explizit auf die Nichtübereinstimmung des Parameternamens hinzuweisen, wird dieser Fehler behoben.


1

Dieser Fehler tritt auf, wenn der Compiler verwirrt ist. Ich bin darauf gestoßen und habe eine langwierige Berechnung durchgeführt, bei der verschiedene Zahlentypen gemischt werden

Ich konnte Abhilfe schaffen, indem ich verschiedene Teilberechnungen in CGFloat goss. Ich musste die Ausdrücke nicht "auflösen", wie in einigen Antworten vorgeschlagen.

  • Von: (ein Float-Ausdruck) * someDouble / someInt
  • An: (einige float Ausdruck) * CGFloat (someDouble / someInt)

0

Dies ist in der Tat ein Speicherproblem. Es ist mir passiert, als ich nur 350 MB freien Speicher auf meinem 16 GB Computer hatte. Die Verwendung von zB CleanMyMac -> Speicher freigeben hat dieses Problem behoben.


1
Kein Speicherproblem. Der Fehler ist auf Computern mit 24 GB freiem Speicher
reproduzierbar

Sind Sie sicher, dass der xCode-Prozess mehr Speicher zuweisen kann, selbst wenn dieser verfügbar ist? Es gibt normalerweise Beschränkungen für Heap- und Stapelgröße pro Prozess.
Gope

Das Freigeben von Speicher hat bei mir funktioniert. Der freie Speicher war 1,2 von 32 GB, als der Fehler auftrat, nach sauberen 13,29 von 32 GB Build-Erfolg
ilker

0

Indem Sie das einfach tun:

    let array = [Int]()
    let dic   = [Int : Double]()
    
    let tuple = array.map { c -> (a: Int, b: Double) in return (a: c, b: dic[c]!) }.sorted(by: { (first, second) -> Bool in return first.b == second.b ? first.a < second.a : first.b > second.b }).first!

Xcode 11.6 benötigt 10 Sekunden CPU, wobei 4 Prozesse mit 100% ausgeführt werden und viel Watt auf meinem MacPro 2019 verbrauchen. Dabei wurde folgende Fehlermeldung angezeigt: (Der Compiler kann diesen Ausdruck nicht in angemessener Zeit tippen. Versuchen Sie, den Ausdruck in aufzuteilen verschiedene Unterausdrücke)

Auch mit nur einer Karte und einer Sorte kombiniert!

Wenn ich mich in 2 aufteile:

let temporaryTupleArrayToAvoidTheCompilerBug = array.map { c -> (a: Int, b: Double) in return (a: c, b: dic[c]!) }

let tuple = temporaryTupleArrayToAvoidTheCompilerBug.sorted(by: { (first, second) -> Bool in return first.b == second.b ? first.a < second.a : first.b > second.b }).first!

Es klappt.

Die Fehlermeldung dient dazu, einen Fehler zu verbergen. Der Compiler kann die Anweisung aufteilen und die Methodensyntax separat überprüfen.


0

Das ist mir passiert. Ich habe zwei Floatan eine SwiftUIStruktur übergeben und eine von der anderen im Inneren subtrahiert, aber aus Versehen habe ich die FloatInnenseite als Datum definiert (verdammt noch mal, Kopieren-Einfügen!).

Es war im Grunde das.

struct Something: View {
    var minValue: Date
    var maxValue: Date

    var body: some View {
        let valueDifference = maxValue - minValue
    }
}

Ich habe es so genannt:

let minValue: Float = 0
let maxValue: Float = 1

Something(minValue: minValue, maxValue: maxValue)

Beachten Sie, dass ich tatsächlich zwei übergebe Float , aber die Struktur akzeptiert sie, obwohl sie als definiert sindDate .

Sobald ich die DateTypen geändert hatte , war Floatdas Problem weg.


0

Ich hatte einen Ausdruck mit mehreren Verwendungen einer optionalen Variablen mit Fallback-Werten wie folgt:

if ((self.scrollView?.contentSize.width ?? 0.0) > 0.0) && ((self.scrollView?.contentSize.height ?? 0.0) > 0.0) && ((self.scrollView?.frame.size.height ?? 0.0) > 0.0) {

Der Fehler wurde behoben, als ich eine nicht optionale Kopie der Variablen erstellte:

guard let scrollView = self.scrollView else { return }
if (scrollView.contentSize.width > 0.0) && (scrollView.contentSize.height > 0.0) && (scrollView.frame.size.height > 0.0) {

Je nachdem, was Sie tun möchten, wenn die optionale Variable Null ist, kann diese einzeilige Version auch nützlich sein:

if let scrollView = self.scrollView, (scrollView.contentSize.width > 0.0), (scrollView.contentSize.height > 0.0), (scrollView.frame.size.height > 0.0) {

-3

Ich stehe vor dem Fehler, weil ich einen String mit enum spleiße.

z.B:

let url = "/api/" + type

Typ ist ein Aufzählungstyp. Ich repariere mit

let url = "/api/" + type.rawValue
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.