Function récursive Swift

Bonjour à  tous :)


 


Je suis actuellement en train de re-coder un algo PHP en Swift mais, je bloque sur une function récursive.


 


En entré de ma fonction j'ai un NSDictionnary sous cette forme : 



{
Amulette = (
39,
38,
37,
36
);
Armes = (
77,
76,
75,
74,
72
);
Bottes = (
47,
48
);
}

Ma fonction : 



func combi( objetListReceipt : NSMutableDictionary){

if(objetListReceipt.count > 0){

let getKey : String = objetListReceipt.allKeys[0] as! String // récup de la 1er key
let current = objetListReceipt.objectForKey(getKey) as! NSArray // recup du 1er element
objetListReceipt.removeObjectForKey(getKey) // delete du 1 element

for _ in current{ // boucle sur le type d'objet courant

print("keys : \(getKey)")

combi(objetListReceipt)
}
}else{
print("combinaison terminé")
nbCombi++
}
}


Le but est d'obtenir en sortie : 


 


keys : Amulette


keys : Armes


keys : Bottes


combinaison terminé


keys : Bottes


combinaison terminé


keys : Armes


keys : Bottes


combinaison terminé


keys : Bottes


combinaison terminé


keys : Armes


keys : Bottes


combinaison terminé


keys : Bottes


combinaison terminé etc etc 


 


Le problème est que pour le moment j'obtiens : 


 


keys : Amulette


keys : Armes


keys : Bottes


combinaison terminé


keys : Bottes


combinaison terminé


keys : Armes


combinaison terminé


keys : Armes


combinaison terminé


keys : Armes


combinaison terminé etc etc


 


Une fois le plus petit niveau terminé, il remonte bien et continu la boucle, mais au moment de redescendre il rentre dans le else, comme si les modifications effectuées dans le niveau inférieure (le 'removeObjectForKey') a été récupéré au niveau supérieure.


 


Doit-on spécifier un terme pour que les modifications des variables au niveau inférieure ne soit pas répercuté dans les niveaux supérieurs ? 


 


Merci d'avance,


Horus.


Réponses

  • Evidemment que les modifications effectuées dans le niveau inférieur sur un NSMutableDictionnary sont répercutées de partout : NSMutableDictionnary est une classe, donc ses instances sont passées par référence. Il n'y a donc qu'un seul dictionnaire.


     


    La solution est donc de faire des copies de dictionnaire à  chaque étape ou d'utiliser les dictionnaires natifs swift, qui, eux, sont passés par valeur.

  • HorusHorus Membre
    juillet 2015 modifié #3

    Ah ok je comprends mieux ... je vais regarder pour la classe dictionnaires de swift.


     


    Merci


     


    PS : Es-ce indiqué dans la doc ? car j'ai du passer à  coté de l'info


    Edit : Afin de savoir ou trouver l'info la prochaine fois ^^


  • zoczoc Membre
    juillet 2015 modifié #4

    Toutes les instances de classe sont passées par référence. Toutes les instances de struct sont passées par valeur. Ca doit être décrit dans les premiers chapitres du livre "The Swift Programming Langage", le livre de référence d'Apple pour Swift.


     


    Il est à  mon avis indispensable de le lire au moins une fois avant d'entreprendre un développement un tant soit peu sérieux. Et en plus il est gratuit.

  • 1149 pages, j'ai commencé aujourd'hui -_- (je bosse sur le premier projet swift de la banque)


  • J'ai utilisé Swifty (Apps iOS) pour voir les bases de Swift, bon j'ai trouvé mon livre de chevet x) 


Connectez-vous ou Inscrivez-vous pour répondre.