a besoin d'obtenir le nom de pays d'un appel d'API ci-dessous Call:
https://rescountries.eu/ Reste / v1 / tout p>
My Code: P>
var arrRes = []
func getCountry() {
let Url: String = "https://restcountries.eu/rest/v1/all"
Alamofire.request(Url).responseJSON { (responseData) -> Void in
do {
if let datas = responseData.result.value {
let data = (datas as AnyObject).data(using: .utf8)!
let parseData = try JSONSerialization.jsonObject(with: data, options: [])
for country in parseData {
if let name = country["name"] as? String {
print(name)
}
}
}
}
catch let error as NSError {
print(error)
}
}
}
6 Réponses :
Remplacer attrape code> bloc de la déclaration avec ceci. do {
if let countries = responseData.result.value as? [[String: Any]] {
for country in countries {
if let name = country["name"] as? String {
print(name)
}
}
}
}
catch let error as NSError {
print(error)
}
Impossible d'invoquer "JSONOBJECT" avec une liste d'arguments de type '(avec: Toute option: [Any])' CODE> On `Laissez parsedata = Essayez jsonserialization.jsonObject (avec: Datas, options: []) . J'ai déjà essayé cela aussi..that Temps aussi la même erreur
Vous n'avez pas besoin de l'erreur comme nserror code> partie. Il suffit de faire } catch {improvement (erreur)} code>.
Merci pour la pointe @RMADDY.
supprimer juste cette ligne
let data = (Datas comme anyobject) .Data (en utilisant: .utf8)! CODE> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> P> La liaison optionnelle vient d'attribuer data code>, puisque code> valeur code> est de type de données? code>, à partir de la liaison optionnelle, obtenez code> code> P> ...jsonObject(with: data, options: []) as? [[String:Any]]
Réponse valide. Je suggère d'essayer d'éviter le comme! Code>, vous pouvez le faire comme? Code> pour la sécurité;)
Vous pouvez essayer
Encore une fois, ne pouvait pas lancer la valeur du type '__nsarrayi' (0x1fa903a70) à 'nsdata' (0x1fa901dd8)
@David Pas besoin de faire de la réponse si vous avez besoin de données avec Codable DOPPONEDATA
Une approche simple, vous pouvez implémenter à ce stade, il n'est pas nécessaire d'utiliser L'avantage de l'utilisation de getcountry () code> comme ceci: jsonserialization < / code> pour obtenir les noms de pays; Selon la réponse de l'API, Responsedata.Result.Value code> est une gamme de pays (dictionnaires), chaque dictionnaire a une valeur "nom", ce que vous devriez faire est de mapper em> la réponse à un tableau de chaîne. CountryNames Code> devrait contient de quoi recherchez-vous. p> compactmap code> est d'éviter tout nil code> nul, donc CountryNames Code> devrait être [string] code> au lieu de [chaîne?] code>. P>
Toutefois, si vous croyez que vous devriez transformer l'ensemble des objets de réponse en objets personnalisés (au lieu de dictionnaires), je recommanderais vivement de suivre l'approche de l'utilisation de décodable code> . p> p>
Essayez ceci, c'est bien fonctionne pour moi.
Mon code, son fonctionnement bien pour moi.
SWIFT 5 P>
public func getCountry(completion: @escaping ([String]) -> ()) {
let url: String = "https://restcountries.eu/rest/v1/all"
AF.request(url).responseJSON { (responseData) -> Void in
do {
guard let data = responseData.data else { return }
let res = try JSONDecoder().decode([CountryName].self,from:data)
completion(self.getCountryName(countryName: res))
}
catch {
print(error)
}
}
}
struct CountryName: Codable {
let name: String
}
private func getCountryName(countryName:[CountryName]) -> [String]{
var country:[String] = []
for index in 0...countryName.count - 1{
country.append(countryName[index].name)
}
return country
}
Dupliqué possible de Comment accéder à une valeur particulière d'une structure a>