API, Structure et Appel réseau


#1

Bonjour à tous,
J’essaye de connecter l’API Google Translate
J’ai un souci avec mon appel réseau. Je ne sais pas comment récupérer ma valeur de retour depuis mon Model.
Mon fichier JSON ressemble à ça :

{
    "data": {
        "translations": [
            {
                "translatedText": "Accueil",
                "detectedSourceLanguage": "en"
            }
        ]
    }
}

Je ne sais pas si mon modèle doit ressembler à ça :

struct TranslationAPIResult: Decodable {

let data : Data

}

struct Data {

var translations:[Translation]

}

struct Translation {

var translatedText:[String:String]

}

OU

struct TranslationAPIResult :Decodable {
	struct Welcome {
		let data: DataClass
	}
	
	struct DataClass {
		let translations: [Translation]
	}
	
	struct Translation {
		let translatedText, detectedSourceLanguage: String
	}
}

En fait ce qu’il se passe c’est que je sais récupérer la valeur dans mon controller quand la structure est simple.
Model :

ex : struct CurrencyCountryListResult: Decodable {

let symbols: [String:String]

}

ViewController :

let currencyApiService = CurrencyAPIService()
var currencyList = [String]()
func requestCountryList(){
		print("load country list")
		currencyApiService.getListCurrencies{(success, symbols) in
			if success {
				print("load country list")
				guard let symbols = symbols else {return}
				for (i, value) in symbols.symbols {
					self.currencyList.append(i)
				}
			} else {
				print("not load country list")
			}
		}
	}

Pouvez vous m’aider pour des structures plus complexes ? Merci d’avance pour votre aide


#2

Moi j’ai utilisé ça et ça a parfaitement fonctionné!

struct DataTranslations: Decodable {
    var data: Translations
}

struct Translations: Decodable {
    let translations: [TranslatedText]?
}

struct TranslatedText: Decodable {
    let translatedText: String?
}

En fait faut voir ça un peu comme du self service, tu prends ce que tu veux dans le JSON, du moment que tu structure les struct du même nom que dans le JSON (ou que tu utilise les CodingKeys).
Genre dans l’API Fixer, tu peux faire une struct qui ne prend que la monnaie que tu veux. Je ne sais pas si ca s’applel comme ca, mais entre chaque accolage c’est un object, du coup tu le bind avec ta struct et tout roule :wink:

struct Rate: Decodable {
    let success: Bool
    let timestamp: Double?
    let base: String?
    let date: String?
    let rates: Rates?
}

struct Rates: Decodable {
    let USD: Double?
}

#3

Merci pour ta réponse. Depuis j’ai réussi à l’utiliser. Effectivement en réalité on se sert juste de ce dont on va avoir besoin. Les structures sont simplement imbriquées les unes dans les autres. D’ailleurs je suis tombé sur un site bien sympa pour convertir son fichier json en structure Swift. Je ne connaissais pas ce genre de trucs et je trouve que ça marche plutôt bien ! Le voici : https://quicktype.io/

Encore merci pour ta réponse !