Comment prendre au hasard


#1

…un élément d’un dictionnaire ?

merci


#2

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


#3

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


#4

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:


#5

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


#6

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
    }

#7

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


#8

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.


#9

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 :


#10

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 …


#11

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

Merci à @anthonyfassler1 et @Draken