首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型'ListViewController.Pokemon‘的值没有下标

类型'ListViewController.Pokemon‘的值没有下标
EN

Stack Overflow用户
提问于 2022-09-28 23:47:56
回答 1查看 24关注 0票数 0

我想从PokeApi返回口袋妖怪名,但是我有一个错误:类型为'ListViewController.Pokemon‘的值没有下标

这是我的密码:

代码语言:javascript
复制
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数据。下面是印刷品中的内容:

代码语言:javascript
复制
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/")])

问题似乎是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-29 00:06:38

您正在尝试访问Pokemon类型并获取它的名称,但是nameResult类型的属性,其实例位于结果数组中。你想要的是:

代码语言:javascript
复制
json.results[0].name

若要获取数组中第一项的名称,请执行以下操作。如果您为您的类型使用了更多信息丰富的名称,那么问题就会更加明显。例如:

代码语言:javascript
复制
struct Wrapper: Codable {
        let results: [Pokemon]
    }
    
    struct Pokemon: Codable {
        let name: String
        let url: String
    }
}

然后你就需要

代码语言:javascript
复制
let wrapped = try JSONDecoder().decode(Wrapper.self, from: data!)
let pokemons = wrapped.results

//etc

self.pokemon2.text = pokemons[0].name
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73888880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档