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
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)
}
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.
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.
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 …