调用PokeApi获取宝可梦名称报错:Value of type 'ListViewController.Pokemon' has no subscripts
问题:从PokeApi获取宝可梦名称时遇到下标访问错误
我尝试从PokeApi获取宝可梦名称,但遇到错误:Value of type 'ListViewController.Pokemon' has no subscripts(中文释义:类型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/")])
错误原因及解决方法
错误原因
你定义的Pokemon结构体是一个包含数组的对象,它本身不是数组。你错误地直接对Pokemon实例(也就是代码里的json变量)使用下标(比如json[0]、json[1]),但Pokemon类型并没有实现下标访问方法,因此编译器报错。
从打印的JSON数据也能明确看到:Pokemon实例内部包含的是results数组,数组里才是每个宝可梦的Result对象(包含name和url属性)。
修正方法
必须先访问json.results拿到数组,再对数组使用下标访问具体元素,最后获取name属性。
修正后的DispatchQueue.main.async代码块如下:
DispatchQueue.main.async { self.pokemon1.text = json.results[0].name self.pokemon2.text = json.results[1].name self.pokemon3.text = json.results[2].name self.pokemon4.text = json.results[3].name self.pokemon5.text = json.results[4].name }
内容的提问来源于stack exchange,提问作者Amaury Gimonnet
相关产品推荐
相关产品推荐

