Convertir un INT en un texte


#1

Bonjour c’est encore moi :blush:

Je reviens vers vous toujours concernant mon application météo.

Dans mon JSON j’ai un code qui s’appel “weatherCode” qui donne un INT ( 2, 45, 78)

Le code que " weatherCode " donne permet de savoir plus précisément et de façon littérale la météo du moment

Petit exemple : “weatherCode”: 4, --> Partly cloudy

comment je peux faire pour avoir une fonction qui modifie directement le code en texte dans mon label

Je pensais à si weatherCode = 4 alors label.text = Party cloudy

mais je ne voie pas comment mettre tout cela en forme dans mes fichiers.

Je vais bien sur chercher les données avec Alamofire

        Alamofire.request(url, headers:headers).responseJSON{ response in
        if let JSON = response.result.value as? [String: AnyObject] {
            if let forecast = JSON ["forecasts"] as? NSArray {
                for element in forecast {
                    if let dict = element as? [String: AnyObject]{
                        if let dates = dict ["validFrom"] as? String {
                            if let weatherCode = dict ["weatherCode"] as? Int {
                                if let temp = dict ["airTemperatureInCelsius"] as? Double {
                                    if let press = dict ["airPressureAtSeaLevelInHectoPascal"] as? Double {
                                        if let hydro = dict ["relativeHumidityInPercent"] as? Double {
                                            if let vent = dict ["windSpeedInKilometerPerHour"] as? Double {
                                
                                                self.datas.append(WeatherProData(date: " Le " + DateHelper.obtenir.dateWeatherPro(dates)! + " à " + (DateHelper.obtenir.heures(dates)!), weatherCode: weatherCode, temp: temp, press: press, hydro: hydro, vent: vent))
                                                
                                                self.tableView.reloadData()
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

J’ai commencé ma fonction dans un fichier Swift

import Foundation

class WeatherCode {

var weatherCode = Int()

func convertirCodeEnString() {
    if weatherCode == 2 {
        
    }
}

}

Mais la je sèche pourriez-vous me mettre sur la voie

Merci


#2

Si je comprend bien, tu veux associer une série de codes numériques à des textes. Le plus efficace c’est d’utiliser un dictionnaire contenant des couples [Int:String].

// Dictionnaire pour les codes
var dicoCodes:[Int:String] = [
    2:"Valeur 2",
    4:"Valeur 4",
    45:"Valeur 45",
    78:"valeur 78"]

La consultation du dictionnaire est similaire à la lecture d’un tableau.

let texte = dicoCodes[code]

A ceci prés que la valeur fournie est optionnelle, pour gérer le cas ou un indice n’existe pas (par exemple il n’y a pas de valeur 17 dans le dictionnaire).

Exemple d’utilisation :

    // Valeur correcte
    let code = 2
    if let texte = dicoCodes[code] {
        print ("Texte : ", texte)
    }

Texte : Valeur 2


#3

Dans un autre registre ton code est bien complexe. Swift permet d’utiliser une syntaxe d’imbrication des tests plus élégante. J’ai repris une petite partie de ton code pour te montrer comment faire. C’est plus lisible, sans l’amoncellement des if let et des } à la fin des tests.

                if let dict = element as? [String: AnyObject],
                   let dates = dict ["validFrom"] as? String,
                   let let weatherCode = dict ["weatherCode"] as? Int,
                   let temp = dict ["airTemperatureInCelsius"] as? Double {
                     // Faire quelque chose si tous les tests sont bons
                   }

En le lisant, je vois que tu utilises déjà les dictionnaires, du moins pour lire les données JSON.


#4

oui c’est une bonne solution Drakken. :+1:


#5

Merci pour ces précieuses information. Je remanie mon code pour plus de clarté.

Encore une question pour être sur;

J’ai bien compris la fonction, mais vue que j’ai 99 codes quelle est la façons la plus correcte de faire.

Je ne vais pas mettre tout cela dans mon controller

Je pensais donc faire un fichier Swift avec tout les codes dedans, mais je ne sais pas si je doit faire une extension, une class et surtout comment m’en servir dans mon controller.

Merci encore


#6

Moi je créerais une classe spécifique, dans son propre fichier. Exemple :

//
//  MesCodes.swift
//  DoubleToString
//
//  Created by Patrick Leclercq on 16/11/2018.
//  Copyright © 2018 patrick leclercq. All rights reserved.
//

import Foundation

// Dictionnaire pour les codes
// L'attribut fileprivate garantit que ce dictionnaire
// n'existe que dans ce fichier.
// Il est invisible pour les autres fichiers de code

fileprivate let dicoCodes:[Int:String] = [
    2:"Valeur 2",
    4:"Valeur 4",
    45:"Valeur 45",
    78:"valeur 78"]

// Lecture du dictionnaire à travers une méthode de classe
class MesCodes {
    static func decodage(code:Int) -> String? {
       return dicoCodes[code]
    }
}

La fonction decodage() est une méthode de classe (attribut static). C’est une fonction générique pouvant être utilisée SANS CREER un objet de type MesCodes. C’est très pratique dans certaines situations.

Pour y accéder dans ton viewControleur, il suffit d’indiquer le nom de la classe et celui de la fonction.

let codeNumerique = 2
if let texte = MesCodes.decodage(code: codeNumerique) {
    print ("Texte : ", texte)
}

Avec une approche objet classique, il faudrais créer un objet MesCodes dans le contrôleur, pour l’utiliser ensuite. En utilisant une méthode de classe, grâce à l’attribut Static, tu évites cette étape. Difficile de faire plus simple …


#7

Merci à tous mon application avance bien grâce à vous.

Je dois encore peaufiné le coté graphique.