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

Swift开发Pokédex应用:无法获取宝可梦Type字段求助

解决PokeAPI获取宝可梦类型名称的问题

问题分析

你的代码存在两个核心问题,导致无法正常获取宝可梦类型名称:

  1. ViewModel数据更新逻辑错误:在getDetails的completion闭包里,你注释掉了更新pokemonDetails的关键代码,还错误地尝试返回DetailPokemon实例——这完全没必要,因为该闭包不需要返回值,最终导致API获取的数据无法传递给视图层。
  2. ID获取方式不可靠:用列表索引+1作为宝可梦ID是错误的,一旦列表排序变化、出现缺失条目,就会请求错误的宝可梦数据,应该直接从列表的Pokemon模型中获取真实ID。

修正后的代码

1. 修正ViewModel的getDetails方法

func getDetails(pokemon: Pokemon) {
    // 直接使用Pokemon模型中的真实ID,而非索引+1
    let id = pokemon.id
    // 保留初始占位数据(可选,用于加载状态展示)
    self.pokemonDetails = DetailPokemon(id: 0, height: 0, weight: 0, types: [])
    
    pokemonManager.getDetailPokemon(id: id) { data in
        DispatchQueue.main.async {
            print(data)
            // 关键:将API返回的数据赋值给pokemonDetails,让视图能拿到更新后的数据
            self.pokemonDetails = data
        }
    }
}

注意:如果你的Pokemon模型还没有id字段,需要在列表请求阶段就获取每个宝可梦的真实ID——PokeAPI列表接口返回的每个条目都带有url,可以从url中解析出ID(比如https://pokeapi.co/api/v2/pokemon/1/中的1就是ID)。

2. 访问宝可梦类型名称

当pokemonDetails更新完成后,你可以通过以下方式获取类型名称:

// 获取所有类型名称的数组
let typeNames = pokemonDetails.types.map { $0.type.name }
// 示例:打印第一个类型名称
if let firstTypeName = typeNames.first {
    print(firstTypeName)
}

额外优化建议

  • 给DetailPokemon添加计算属性,方便快速获取类型名称:
struct DetailPokemon: Codable {
    let id: Int
    let height: Int
    let weight: Int
    let types: [PokemonType]
    
    // 计算属性:直接返回所有类型名称的数组
    var typeNames: [String] {
        types.map { $0.type.name }
    }
}

后续使用时直接调用pokemonDetails.typeNames即可。

  • 增强错误排查:在fetchData的failure闭包里打印更详细的错误信息(比如解析错误、网络错误的具体描述),方便定位问题。

内容的提问来源于stack exchange,提问作者Abhishek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:35:16