Problème de dictionnaire


#1

Bonjour à tous ami(e)s codeurs(euses),

Je tente de créer une 1ere app basique qui permettrait de déterminer l’âge d’un chat en équivalent d’âge humain.
Pour cela, j’ai crée un dictionnaire de type [Int,Int] avec des valeurs trouvées sur Internet.

J’ai donc un champ texte dans lequel on saisi l’âge du chat puis, en cliquant sur un bouton, j’aimerai pouvoir faire correspondre cet âge à la clé du dictionnaire afin de renvoyer la valeur correspondante dans le label de réponse.

Je cherche, je cherche, je cherche… mais je ne trouve pas la solution. Quelqu’un aurait-il un indice ?

Merci par avance.


#2

Bonjour
L’âge d’un chat, ce n’est pas tout simplement son age fois 4 ?

Sinon un truc de ce genre…


#3

Merci Fanfan pour cette réponse si rapide.

Eh non, l’équivalent en âge humain d’un chat n’est pas si simple et varie en fonction des années. Voici ma bibliothèque créée en fonction des données trouvées sur Doctissimo.

var concordanceAge: [Int:Int] = [1:19,2:24,3:28,4:32,5:36,6:40,7:44,8:48,9:52,10:56,11:60,12:64,13:68,14:72,15:76,16:80,17:84,18:88,19:94,20:100,21:110]

Merci encore. Effectivement avec la réponse tout parait tellement simple…


#4

Mon chat a 6 mois :wink:


#5

A priori, je dirais 18 ans : https://absolumentchats.com/quel-age-humain-a-mon-chat/ :wink:


#6

Heu… je disais ça pour que tu le prevois dans ton application :wink:


#7

Attention, la solution de Fanfan (qui ne fait pas attention à ce qu’on lui explique sur les dictionnaires. Grrrr…) est dangereuse !

let ageAfficher = ageDeChat[int(réponse)!]

Cela fonctionne bien si l’utilisateur donne effectivement un chiffre correspondant aux clés existantes. Mais que se passe-t-il avec la valeur 1,5 (pour un an et demi) ? Ou 82 parce qu’il est facétieux ou confond avec la grand-mère ? Réponse : UN BEAU PLANTAGE !

Une application doit être Idiot Proof. Elle doit résister à toutes les co…ries et erreurs de l’utilisateur.

Le résultat de la recherche dans un dictionnaire est toujours une variable optionnelle, contenant nil si la clé demandé n’existe pas. Forcer la conversion de l’optionnelle avec l’opérateur ! provoque automatiquement un plantage si la recherche échoue.

Il faut écrire quelque chose comme :

if let ageAfficher = ageDeChat[réponse] {
  // Faire quelque chose avec l'âge calculé
}

Et rajouter éventuellement un else pour afficher qu’il y a un problème avec l’âge demandé.

let ageAfficher = ageDeChat[int(réponse)!]

Convertir une chaîne en un Int directement à l’intérieur de l’appel au dictionnaire n’est pas une bonne idée non plus. Si l’utilisateur a tapé “croquette” à la place de l’âge du chat, la conversion String->Int vas forcément échouer.


#8

Désolé Draken, j’ai repris vite fait ce que je faisais jusqu’à présent. Je dois aussi reprendre le cours sur les optionnels pour compléter tes explications. Ce que je compte bien faire pour pouvoir sortir des applications de qualité.
J’en profite pour te remercier de tous tes retours sur ce forum toujours très enrichissants.


#9

Merci Draken pour ces explications. Mais effectivement, j’avais vu ce “petit” couac et modifié mon code en fonction. De même, j’avais rajouté un else pour un âge au de la de 21 ans.


#10

#Lolo Ce serait très sympa si tu acceptais de montrer ton code final. Je suis pas encore au point avec les optionnels à vérifier, ça m’intéresse de voir comment tu as fait.

J’ai mis des contrôles :

ça donne ça :
Age de chat

merci

EDIT :
j’ai changé cette ligne :

index >= 4 || index <= 8

#11

Tu peux faire la même chose, d’une manière plus moderne, avec un espace de valeur.

    let espaceValeurs = 4...8
    let index = 6
    if espaceValeurs.contains(index) {
        print ("C'est dedans..")
    } else {
        print ("C'est dehors..")
    }

https://developer.apple.com/documentation/swift/closedrange


#12

Quand tu auras terminé ta petite application, passe à l’étape suivante en remplaçant le champ texte par un PickerView.

Voire même un PickerView à deux colonnes pour donner l’âge du chat en année et en mois. Vu les chiffres de ton tableau, une différence de quelques mois peut représenter plusieurs années humaines.


#13

Pourquoi est-ce que tu utilises un dictionnaire, alors qu’un tableau suffit ?

var tableauAgeChat =  [19, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 94, 100, 110]

let ageChat = 3
let ageHumain = tableauAgeChat[ageChat-1]

Les dictionnaires sont conçus pour gérer des données disparates, avec des “trous” dans les index. Alors que là, c’est une série de chiffres qui se suivent, avec une cohérence parfaite entre l’indexation et la position dans la liste.


#14

Et sinon mathématiquement on peut s’en sortir aussi.

C’est presque parfait avec une equation du type y = ax+b
J’ai pris les données et dans un tableur voila ce que ca donne :

a = 1/3
b = 16

Effectivement il y a un petit biais pour les chatons et les vieux chats. Je pense qu’on doit pouvoir calculer de la meme façon avec plus de données, plusieurs equations a utiliser selon l’input.