Initialiser variable avec paramètres

Bonjour,

Je suis parti du cours :

J’essaie d’aller plus loin dans l’application « Tasks »
J’ai glissé toutes mes tâches dans une liste.
Lorsqu’une tâche est sélectionnée, on change de View grâce à une NavigationView vers SousTachesView.

ForEach(taskManager.taskList){ taches in
                    HStack {
                        NavigationLink(
                            destination: SousTachesView(objTask: taches),
                            label: {
                        Text("\(taches.taskName)")
                        Spacer()
                        })
                    }

Dans SousTachesView je souhaite avoir des « SousTâches » qui apparaissent.
Et notamment je cherche dans CoreData une liste de sous tâches qui correspondent à la tâche principale selectionnée.
Quand j’arrive dans SousTachesView j’ai

struct SousTachesView: View {
let objTask: Task
@State var sousTaskManager = SousTaskManager(objTache: objTask) ← ERREUR : Cannot use instance member ‹ objTask › within property initializer; property initializers run before ‹ self › is available

J’ai cependant une erreur : Comment envoyer ma tâche à SousTaskManager avec le paramètre objTask que j’initialise ?
Sinon pouvez-vous m’aiguiller vers des chapitres ou notions à approfondir ?
Merci
Clément

Salut,
il est possible d’initialiser une variable avec un paramètre mais tu ne peux pas utiliser une variable qui n’est pas encore initialisée, ce qui est le cas ici de objTask.
Tu as 2 solutions pour y avoir accès :

  • Soit tu crées un constructeur manuellement et dans le init, tu pourras accéder à l’objet objTask reçu en paramètre
  • Soit tu utilises la fonction onAppear sur ta vue pour déclencher du code dès que ta vue est disponible :
.onAppear {
    sousTaskManager.chargerTask(self.objTask)
}
2 « J'aime »

Merci Maxime,
J’ai compris le principe de onAppear et ça fonctionne…
Enfin ça devrait, le problème est reporté ailleurs !

struct sousTaskManager {
var sousTaskList:[SousTask]
let storage: OriEPS = OriEPS()
let taskId : UUID

init(taskId:UUID) {
        sousTaskList = storage.fetchSousTaskList(taskId: taskId)
}

L’erreur suivante apparait : Return from initializer without initializing all stored properties
Cette fois-ci je ne suis pas dans une View, donc je ne peux pas utiliser la méthode onAppear.

Deuxième problème, quand l’application s’ouvre, je n’ai pas encore choisi de Tâche principale, donc je n’ai pas de « id » de tâche à transmettre.
Donc je ne veux pas que la sousTaskList (et notamment SousTaskManager() ) se charge tant que la tâche n’est pas choisie, comment puis-je faire ? Comment retarder l’init()
Sinon vers quel chapitre m’orienter pour obtenir ces informations ?

Merci d’avance

Je ne sais pas si c’est ça, mais j’ai l’impression que tu veux assurer la permanence d’un tableau que tu n’as pas encore initialisé ? En fait, as-tu mis des sousTask dans sousTaskList ou l’as tu juste déclaré ? Je te prie de m’excuser si je suis à côté de la plaque.

En fait je ne veux pas initialiser ce tableau avant d’avoir choisi une Tache principale.

Mais j’ai l’impression que ma struct SousTaskManager s’initialise des l’ouverture de l’application

J’aimerais que ce soit comme une deuxième page, tant que l’on n’a pas lu la première et tourné la page, il ne se passe rien sur la deuxième.

Tu as une propriété taskId qui n’est pas initialisée à la fin de ton constructeur.
Si tu as vraiment besoin de cette propriété, tu dois ajouter la ligne suivante au tout début de ton constructeur :

self.taskId = taskId
1 « J'aime »

Parfait merci,
C’est compris ! Je me suis orienté vers le cours sur les initialisateurs et c’est plus clair maintenant !

1 « J'aime »