web-dev-qa-db-fra.com

Impossible de déduire un type de retour de fermeture complexe avec SwiftUI

Suite à la partie 3 du tutoriel d'Apple sur SwiftUI, Gestion des entrées utilisateur , j'obtiens cette erreur:

Impossible de déduire le type de retour de fermeture complexe; ajouter un type explicite pour lever l'ambiguïté

J'utilise le même code que le didacticiel (même la copie à partir de l'exemple de code "complet" ne résout pas l'erreur).

Quelqu'un sait-il ce qui ne va pas ici?

enter image description here

struct LandmarkRow: View {
    var landmark: Landmark

    var body: some View {
        HStack {
            landmark.image(forSize: 50)
            Text(verbatim: landmark.name)
            Spacer()

            if landmark.isFavorite {
                Image(systemName: "star.fill")
                    .imageScale(.medium)
            }
        }
    }
}

Quelle que soit la cause du problème, comment pourriez-vous en effet ajouter un type explicite pour lever l'ambiguïté ici? Quel serait le type de retour dans un tel cas?

-

Mise à jour

Apparemment, vous ne devriez pas continuer avec votre résultat du 2e tutoriel avec le 3e. Certaines choses ont changé entre les didacticiels qui ne sont pas documentées dans le didacticiel. J'ai ajouté les fichiers du projet à Github pour que vous puissiez consultez le diff .

Il vaut mieux recommencer le 3ème tutoriel avec un nouveau téléchargement des fichiers Project du ème tutoriel .

11
Tieme

Le problème n'est pas lié à la fermeture, mais à la propriété isFavorite sur un point de repère.

Elle n'est pas déclarée sur le type Landmark et le compilateur au lieu d'afficher l'erreur de propriété non déclarée, impossible de résoudre le type de retour de fermeture de la construction des piles, donc il y a une erreur.

Excellent travail Apple rédacteurs de tutoriels et encore mieux un compilateur Xcode11.

Pour corriger:

  1. Déclarez la variable isFavorite sur le type Landmark.
  2. Assurez-vous de mettre à jour le landmarkData.json pour chaque record historique avec le isFavorite = false entrée, sinon l'application se bloquera lors de l'exécution.
13
dirtydanee

Contexte de ce problème

Comme @dirtydanee a déjà répondu, il y a une différence entre ces deux tutoriels. Mais le problème derrière le problème est que, même s'il semble que vous effectuez une configuration, il s'agit en fait de fonctions imbriquées dans des fonctions utilisant des génériques et des protocoles pour analyser "par magie" tout en une fonction de compilation.

Cependant, la conformité à ces génériques et protocoles doit être assez précise car sinon l'arborescence entière des fonctions ne peut plus être compilée. Mais il est difficile de déterminer pour le compilateur quelle conformité a réellement échoué. C'est pourquoi vous voyez une erreur en haut plutôt qu'au point où elle se produit réellement.

Il est fortement conseillé de vous assurer que vos vues sont décomposées en blocs naturels et simples afin de ne pas déverser sur des centaines de lignes de code View pour trouver ce bogue.

Dave DeLong avait n très bon discours sur la façon de composer des vues à partir de ViewControllers qui reste vrai jusqu'à aujourd'hui: fondamentalement, vous n'utilisez jamais View comme sous-vue dans une autre View mais vous devez décomposer votre vue de nombreuses vues simples. Sinon, ces erreurs vous rendront fou.

2
Departamento B