106 votes

Le compilateur est incapable de vérifier le type de cette expression swift 4 ?

Après avoir mis à jour xCode je reçois cette erreur dans mon code :

Le compilateur est incapable de vérifier le type de cette expression dans des conditions raisonnables. temps raisonnable ; essayez de décomposer l'expression en sous-expressions distinctes

Le 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 )
    }
}

Erreur dans la ligne :

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

Comment résoudre ce problème ?

0 votes

Est-ce que certaines des valeurs de ce code sont des valeurs calculées ? par exemple options.textWidth ? Vous pourriez essayer de spécifier la classe de chaque variable, plutôt que de vous fier à l'inférence de type, par ex. let spaceFromLeftSide: CGFloat =

2 votes

Lorsque cela se produit, un processus nommé SourceKitService utilise plus de 13 Go de mémoire sur ma machine de 8 Go. Habituellement, il utilise un peu plus de 300 Mo. Il semble que certaines expressions créent des fuites de mémoire dans le processus de construction.

13 votes

Je dois admettre que j'ai levé les yeux au ciel quand j'ai vu cette erreur.

124voto

Ankit Jayaswal Points 3477

Le compilateur est incapable de vérifier le type de cette expression en un temps raisonnable ; essayez de décomposer l'expression en sous-expressions distinctes

Cette erreur apparaît lorsque le compilateur swift trouve le calcul de l'expression long. Pour plus de détails Vérifiez ici

Pour résoudre ce problème, il suffit de diviser votre expression en plusieurs parties. Par exemple :

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

let spaceFromRightSide = cutOutxOrigin + actualPadding

17voto

Prashant Tukadiya Points 6585

J'ai rencontré un problème similaire avec un scénario différent

J'ai essayé de créer un tableau de chaînes de caractères

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

J'ai déjà ajouté des crochets () mais ça ne marchait toujours pas.


Pour résoudre ce problème, j'ai ajouté le type [String]

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

J'espère que cela sera utile à quelqu'un qui rencontre le même problème.

12voto

Milan Nosáľ Points 12260

Essayez simplement de décomposer l'expression en plusieurs sous-expressions plus simples. Par exemple :

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

EDIT

J'ai remarqué que j'ai pu corriger ce type d'erreur également en fournissant des conversions de type explicites (par exemple, au lieu de compter sur le compilateur pour déduire qu'en multipliant un CGFloat avec un Int il devrait en résulter CGFloat j'ai explicitement converti le Int a CGFloat ). Il semble que le problème réside effectivement dans les types et l'inférence et la vérification automatiques des types. Alors que la décomposition de l'expression complexe en parties plus petites peut être très utile pour la lisibilité, vous pouvez résoudre le problème en étant explicite sur les types (le message d'erreur dit essentiellement que le compilateur est incapable de faire la vérification de type - donc vous pouvez l'aider en fournissant des types explicites partout où cela est possible).

7voto

Snips Points 2940

Je rencontre ce problème assez régulièrement lorsque je travaille avec SwiftUI, et c'est toujours le résultat d'une erreur de syntaxe. J'utilise actuellement Xcode 11.4.1, et c'était vrai pour les versions antérieures supportant SwiftUI.

Par exemple, je viens de brûler 50 minutes avec cette erreur parce que j'avais changé le nom d'un paramètre de fonction dans un autre fichier. Le compilateur a signalé cette erreur dans un fichier SwiftUI qui était complètement intact, sauf qu'il invoquait la fonction sans le nom de paramètre modifié. Plutôt que de signaler explicitement la non-concordance des noms de paramètres, le compilateur a signalé cette erreur.

6voto

gbarnett Points 183

J'ai eu cette erreur lorsque j'ai accidentellement mélangé une option dans une expression. Après avoir forcé le déballage, l'erreur a disparu.

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

0 votes

Merci. Cela masquait en effet l'erreur sous-jacente. Dans mon cas, j'essayais d'itérer sur un protocole personnel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X