Comment prendre au hasard

…un élément d’un dictionnaire ?

merci

Salut,

Avec Swift 4.2 c’est plus simple que avec les version précédente.

let randomVal = myDict.values.randomElement()

ou

let randomVal = myDict.randomElement().value

Avant c’était comme ça :

var dict:[String:Int] = ["A":123, "B": 234, "C": 345]
let index: Int = Int(arc4random_uniform(UInt32(dict.count)))
let randomVal = Array(dict.values)[index] # 123 or 234 or 345

Je te le mets pour comprend la logique et si, tu n’utilise pas Xcode 10 et Swift 4.2

1 « J'aime »

Merci pour les explications :slight_smile:
J’ai ajouté un ! dans le playground pour l’optional
Avec l’ancienne syntaxe, il n’y avait pas d’optional

Ce n’est pas une bonne idée de forcer la conversion de l’optionnel. Si le dictionnaire est vide, sans aucun contenu, la tentative de tirage aléatoire vas planter l’application :boom:

Même si on compte le nombre d’éléments dans le dictionnaire pour vérifier s’il est vide ?

Quel est le code le plus simple ?

if monDico.count != 0 {
    let valeur = monDico.randomElement()!.value
    // faire un truc avec la valeur
}

Ou ça ?

    if let valeur = monDico.randomElement()?.value {
        // faire un truc avec la valeur
    }
1 « J'aime »

le 2nd code… mais je n’arrive pas l’intégrer correctement dans mon projet.
Du coup j’ai fait comme ça.

Salut @Fanfan,

Ça fonctionne aussi comme tu as fait mais, c’est l’ancienne méthode en fait, si tu aurais fait, comme @Draken a dit tu aurais du écrire dans ta fonction afficherImage ceci :

if let elementAuHasardDuDictionnaire = tableX5.randomElement()?.value {

     produitImageView.image = UIImage(named : elementAuHasardDuDictionnaire)

}

Enfaite, le if let veux dire si, tu arrives a trouver une valeur, tu la mets dans une constant.

Je viens de tester et j’ai une erreur sur le code (ainsi que pour le Print)

Mais en fait, ce n’est pas la valeur que je veux mais la clef : le string, pas le Int car c’est le String qui correspond au nom de l’image à afficher, j’ai donc changer le if let en :
if let elementAuHasardDuDictionnaire = tableX5.randomElement()?.keys {
et j’ai une autre erreur :

C’est normal qu’il se produise une erreur. L’opérateur pour lire la clé c’est .key et non .keys ! Retire le s en trop dans ton code …

1 « J'aime »

En effet, ça fonctionne mieux sans le S :wink:

Merci à @ThonyF et @Draken