[SWIFT] Recherche d'une valeur dans un dictionnaire

Bonjour tout le monde,

Je suis en train de m'emmêler les pinceaux avec une histoire de dictionnaire.. et comme c'est vraiment pas mon truc, je m'en remet à vous ^^

J'ai un dictionnaire de type :

struct StructurePourListe : CustomStringConvertible, Hashable {

var id: Int
var value: String
var hashValue : Int {
    return self.id.hashValue
}

init(id: Int, value: String) {
    self.id = id
    self.value = value
}

// Ce qui sera affiché
var description: String {
    //return "\(self.id)"+" "+"\(self.value)"
    return "\(self.value)"
}

}

Dans mon code, je remplis mon dictionnaire de cette façon :

var arrayOfMyStruct:[StructurePourListe] = []
for (_,DestinataireJson):(String, JSON) in recupJSON["Data","Destinataire"] {
    let NomPrenom = DestinataireJson["NomPrenom"].stringValue+" ("+DestinataireJson["Login"].stringValue+")"
    let Id = DestinataireJson["Id"].intValue
    arrayOfMyStruct.append(StructurePourListe(id: Id, value: NomPrenom))
}

Quand je fais un print de mon dictionnaire, je me retrouve avec :

[Utilisateur1 (Login1), Utilisateur2 (Login2), Utilisateur3 (Login3)]

Plus loin dans mon code, je récupère un utilisateur (j'ai son Id et son NomPrenom (Login))

Comment je peux faire pour vérifier si il est dans mon dictionnaire ou pas ?
J'ai testé plein de trucs et j'ai l'impression de tourner en rond :s

Mots clés:

Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur

    Mais tu ne joue pas avec un dictionnaire, tu utilises un array !!!

    Pourquoi pas utiliser un vrai dictionnaire ?

  • InsouInsou Membre

    Parce que le code est mal foutu et que je ne peux pas trop y toucher sinon ça se répercute partout :D

    En gros, j'ai juste une vérification à faire dans le code, si l'utilisateur existe dans mon arrayOfMyStruct alors je l'ajoute ailleurs, sinon je ne fais rien.
    Le truc c'est que j'arrive pas à rechercher si l'utilisateur existe dans le arrayOfMyStruct :/
    T'as une idée de comment faire ?

  • LarmeLarme Membre
    10 juil. modifié #4

    Non testé :

    let structureToFind = ...
    if let structurePourList = arrayOfMyStruct.first(where: {$0.id == structureToFind.id && $0.value == structureToFind.value}) {
        print("Found")
    } else {
        print("Not found")
    }
    

    Mais je pense qu'en faisant du Equatable sur StructurePourListe, tu devrais pouvoir faire:

    let structureToFind = ...
    if arrayOfMyStruct.contains(structureToFind) {
        print("Found")
    } else {
        print("Not found")
    }
    

    En rajoutant:

    extension StructurePourListe: Equatable {
        func ==(lhs: StructurePourListe, rhs: StructurePourListe) -> Bool {
          return lhs.value == rhs.value && lhs.id == rhs.id
        }
    }
    
  • DrakenDraken Membre
    10 juil. modifié #5

    Ton code est bien compliqué. Voici un exemple simplifié d'utilisation d'un dictionnaire en Swift :

          // Création du dictionnaire
           var leDico = [Int:String]()
    
            // Remplissage du dico
            leDico[123] = "John"
            leDico[35] = "Peter"
            leDico[12] = "Sophie"
    
            // Lecture d'un identifiant valide
            let id_01 = 35
            if let nom = leDico[id_01] {
                print ("id", id_01, ":", nom)
            }
    
            // Lecture d'un identifiant NON valide
            let id_02 = 1024
            if let nom = leDico[id_02] {
                print ("id", id_02, ":", nom)
            } else {
                print ("L'identifiant ", id_02, " n'est pas VALIDE !")
            }
    

    EDIT : Le nounours a raison, ce n'est pas un dictionnaire dans ton code, mais un tableau. Tu te compliques la vie pour rien. C'est super facile d'utiliser un VRAI dictionnaire en Swift ..

  • InsouInsou Membre
    10 juil. modifié #6

    @Larme Voila, c'est ce que je cherchais avec "contains" mais j'avais pas pigé qu'il fallait mettre un type "StructurePourListe" dedans.. je cherchais avec un string :s
    La structure était déjà "Equatable" .. au moins un truc de bien fait ^^

    @Draken Ouai c'est carrément plus simple mais c'est un projet dont j'ai repris le code et si j'ai le malheur de changer la façon dont il gère ça, ça va impliqué que je refasse tout son contrôleur, avec tout les tests qui vont avec.. autant te dire que j'ai pas le temps pour ça ^^
    Mais ton exemple est clairement plus simple que le code de merde du projet, c'est clair :)

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