我想從 PokeApi 回傳口袋妖怪名稱,但我有這個錯誤: 'ListViewController.Pokemon' 型別的值沒有下標。
這是我的代碼:
import UIKit
class ListViewController: UIViewController {
@IBOutlet weak var pokemon1: UILabel!
@IBOutlet weak var pokemon2: UILabel!
@IBOutlet weak var pokemon3: UILabel!
@IBOutlet weak var pokemon4: UILabel!
@IBOutlet weak var pokemon5: UILabel!
let url = "https://pokeapi.co/api/v2/pokemon"
override func viewDidLoad() {
super.viewDidLoad()
fetchData(from: url)
}
func fetchData(from url: String) {
let url = URL(string: url)
let defaultSession = URLSession(configuration: .default)
let dataTask = defaultSession.dataTask(with: url!) { (data: Data?, response: URLResponse?, error: Error?) in
if(error != nil) {
print(String(describing: error))
return
}
var json: Pokemon
do {
json = try JSONDecoder().decode(Pokemon.self, from: data!)
Swift.print(json)
DispatchQueue.main.async {
// self.pokemon1.text = json[0].name
self.pokemon2.text = json[1].results.name
// self.pokemon3.text = json[0].results.name
// self.pokemon4.text = json[3].name
// self.pokemon5.text = json[4].name
//callback: fonction que j'appelle à la suite d'un évènement
}
} catch {
print(error)
return
}
}
dataTask.resume() // Commence la dataTask si elle n'est pas en marche actuellement
}
struct Pokemon: Codable {
let results: [Result]
}
struct Result: Codable {
let name: String
let url: String
}
}
我檢查了列印件,我收到了 json 資料。這是印刷品中的內容:
Pokemon(results: [RattrapageIOS.ListViewController.Result(name: "bulbasaur", url: "https://pokeapi.co/api/v2/pokemon/1/"), RattrapageIOS.ListViewController.Result(name: "ivysaur", url: "https://pokeapi.co/api/v2/pokemon/2/"), RattrapageIOS.ListViewController.Result(name: "venusaur", url: "https://pokeapi.co/api/v2/pokemon/3/"), RattrapageIOS.ListViewController.Result(name: "charmander", url: "https://pokeapi.co/api/v2/pokemon/4/"), RattrapageIOS.ListViewController.Result(name: "charmeleon", url: "https://pokeapi.co/api/v2/pokemon/5/"), RattrapageIOS.ListViewController.Result(name: "charizard", url: "https://pokeapi.co/api/v2/pokemon/6/"), RattrapageIOS.ListViewController.Result(name: "squirtle", url: "https://pokeapi.co/api/v2/pokemon/7/"), RattrapageIOS.ListViewController.Result(name: "wartortle", url: "https://pokeapi.co/api/v2/pokemon/8/"), RattrapageIOS.ListViewController.Result(name: "blastoise", url: "https://pokeapi.co/api/v2/pokemon/9/"), RattrapageIOS.ListViewController.Result(name: "caterpie", url: "https://pokeapi.co/api/v2/pokemon/10/"), RattrapageIOS.ListViewController.Result(name: "metapod", url: "https://pokeapi.co/api/v2/pokemon/11/"), RattrapageIOS.ListViewController.Result(name: "butterfree", url: "https://pokeapi.co/api/v2/pokemon/12/"), RattrapageIOS.ListViewController.Result(name: "weedle", url: "https://pokeapi.co/api/v2/pokemon/13/"), RattrapageIOS.ListViewController.Result(name: "kakuna", url: "https://pokeapi.co/api/v2/pokemon/14/"), RattrapageIOS.ListViewController.Result(name: "beedrill", url: "https://pokeapi.co/api/v2/pokemon/15/"), RattrapageIOS.ListViewController.Result(name: "pidgey", url: "https://pokeapi.co/api/v2/pokemon/16/"), RattrapageIOS.ListViewController.Result(name: "pidgeotto", url: "https://pokeapi.co/api/v2/pokemon/17/"), RattrapageIOS.ListViewController.Result(name: "pidgeot", url: "https://pokeapi.co/api/v2/pokemon/18/"), RattrapageIOS.ListViewController.Result(name: "rattata", url: "https://pokeapi.co/api/v2/pokemon/19/"), RattrapageIOS.ListViewController.Result(name: "raticate", url: "https://pokeapi.co/api/v2/pokemon/20/")])
似乎是什么問題?
uj5u.com熱心網友回復:
您正在嘗試訪問該Pokemon型別并獲取它的名稱,但它name是該型別的一個屬性,其Result實體位于結果陣列中。你想要的是:
json.results[0].name
獲取陣列中第一項的名稱。如果您為您的型別使用更多資訊性名稱,則問題會更加明顯。例如。
struct Wrapper: Codable {
let results: [Pokemon]
}
struct Pokemon: Codable {
let name: String
let url: String
}
}
然后你需要
let wrapped = try JSONDecoder().decode(Wrapper.self, from: data!)
let pokemons = wrapped.results
//etc
self.pokemon2.text = pokemons[0].name
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/509967.html
標籤:IOSjson迅速代码
下一篇:“沒有與鍵CodingKeys關聯的值(stringValue:\"index\",intValue:nil)(\"index\")。”,underly
