You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 09:01:01