1H pour créer un jeu iPhone avec SwiftUI

Bonjour à toutes et à tous !

J’ai suivi le cours 1H pour créer un jeu iPhone avec SwiftUI, et en faisant l’exercice, j’ai voulu mettre à jour le bestscore (avec bestscore = score) directement dans le test affichant la flamme.

J’ai eu en retour un message d’erreur (cf copie d’écran) que je ne comprends pas (Type ‹ () › cannot conform to ‹ View ›).

Pourtant, si je mets mon bestscore = score plus loin dans le code (toujours dans la View), mais dans une closure dans un Timer (c’est ce qui fait toute la différence ?), ça fonctionne.

Je n’ai probablement pas encore les compétences pour comprendre de quoi il retourne, commençant tout juste à apprendre Swift, mais est-ce que quelqu’un pourrait expliquer de quoi il retourne ?

Rénald

Bonjour,

Avec SwiftUI tu ne peux pas mettre à jour ta variable à cet endroit dans la vue pour faire simple, la mise à jour ou les accès se font via des actions comme les boutons ou alors une action sur un texte ou une image. Sinon tu as ce type d’erreur pour faire simple.

Plus bas cela fonctionne, car ta variable est mise à jour dans un bouton (« nouvelle partie ») et pour l’image cela fonctionne aussi, car ton action est via le .onTapeGesture(action sur l’image) lorsque tu appuies sur l’image.

En gros dans une vue il te faut une propriété "action sur un objet (image, texte, bouton…)
Sinon tu ne peux pas mettre à jour ta variable.

Même chose pour ton « Timer.scheduledTimer » qui effectue « actions à effectuées » donc tu peux faire des modifications de variables, des appels de fonction sans aucun problèmes.

j’espère que je suis claire.

2 « J'aime »

Là où tu le mets, SwiftUI n’accepte que des View ; le test sur score autorise ou non l’affichage d’une View, en l’occurence, une Image, celle de la flamme, et tu rajoutes une affectation, c’est une opération d’affectation et non une View.
Alors que plus bas, tu es entre les accolades d’une closure qui représente l’action liée au bouton ; cette closure peut bien contenir toute action d’affectation sans problème. Elle s’attache au bouton qui, lui, est une View.
Avec SwiftUI, tu ne programmes plus. Tes objets sont des « View », ils font appel à des objets pourvus de méthodes, comme des struct, des classes, et c’est seulement dans ces méthodes que tu glisses du code. Mais dans une View, tu déclares des Views, conformes à « View », tu ne peux plus glisser du code.
Le test qui permet de vérifier si une View doit être affichée ou non te donnes à croire que tu peux coder là, mais c’est en fait une exception, qui montre d’ailleurs la fragilité de toute l’architecture de SwiftUI, mais aussi sa souplesse, seulement ça te porte à croire que là, tu peux coder, alors que ce n’est pas le cas du tout. Au début, avec SwiftUI, on arrête pas de faire ça, et sans arrêt, Xcode te renvoie dans les cordes, jusqu’à ce que tu aies bien pris le réflexe. Séparer l’affichage et le programme… :slightly_smiling_face:

2 « J'aime »

Merci beaucoup pour ta réponse :slight_smile:

Rénald

ok je crois que j’ai pigé, merci bcp pour ta réponse :slight_smile:
Rénald