Choisir un Dictionnaire en fonction d'une variable


#1

bonjour
Soit une fonction qui appelle un élément d’un dictionnaire (ici le dictionnaire “jaune”) :

func afficherImage() -> Int {
    
        if let elementAuHasardDuDictionnaire = jaune.randomElement()?.key {
                          
            elementAffiche = jaune[elementAuHasardDuDictionnaire]!
            
            produitImageView.image = UIImage(named : elementAuHasardDuDictionnaire)
            
        }
        return elementAffiche

Cela tourne.

Maintenant, je souhaitais que le dictionnaire utilisé change selon une variable du type :
si l’utilisateur est au niveau 1, j’utilise le dictionnaire “jaune” ; si l’utilisateur est au niveau 2, j’utilise le dictionnaire “orange”…

J’ai donc fait un if else :

`func choixDuLevel()-> String {
    if niveau == 1 {
        level = "jaune"
    } else if niveau == 2 {
        level = "orange"
    } else if niveau == 3 {
        level = "rouge"
    }
    return level
}


func afficherImage() -> Int {
    
        if let elementAuHasardDuDictionnaire = level.randomElement()?.key {
            
            
            elementAffiche = level[elementAuHasardDuDictionnaire]!
            
            produitImageView.image = UIImage(named : elementAuHasardDuDictionnaire)
            
        }
        return elementAffiche
    }

Mais j’obtiens une erreur “Value of type ‘Character’ has no member ‘key’” Mais “level” est une variable de type String ? Bref, je ne comprends pas le problème…

EDIT : je viens de comprendre que ma var level contient juste une String, non les données du dictionnaire jaune… :wink:


#2

Et je viens de me corriger :slight_smile:
J’ai retiré les parenthèses et ça semble fonctionner …


#3

Ce serait plus efficace de retourner directement le dictionnaire concerné en fonction du niveau courant, sans passer par une variable intermédiaire.

Une possibilité :

let dicoJaune  = ["blala":2,   "truc":4]
let dicoOrange = ["pomme":65,  "banane":6]
let dicoRouge  = ["camion":32, "avion":12]

func chercherDictionnaireCourant(indexNiveau:Int) -> [String:Int]? {
    switch indexNiveau {
    case 1:
        return dicoJaune
    case 2:
        return dicoOrange
    case 3:
        return dicoRouge
    default:
        return nil
    }
}

Le code est plus complexe, parce que je prend en compte la possibilité d’une erreur sur l’identifiant numérique du niveau. Que va-t-il se passer dans ton code si la variable niveau contient 0, alors qu’il n’existe pas de niveau correspondant ?

Exemple d’utilisation dans le code :

    let niveauJeu = 2
    if let dicoCourant = chercherDictionnaireCourant(niveau: niveauJeu) {
      // Faire quelque chose avec le dictionnaire
    } else {
        print ("Erreur dans la numérotation des Niveaux")
        print ("Niveau demandé : ", niveauJeu)
    }

J’affiche un message d’erreur si le numéro du niveau ne correspond pas à un dictionnaire. Cela n’est pas vraiment nécessaire, mais simplifie l’identification du problème en cas de bug.


#4

Je vais essayer d’intégrer ce code. merci