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

Swift技术问题:如何将API返回的Nft Struct中Creator数据存入数组

正确提取NFT中Creator数据到数组的方法

原代码问题分析

你当前的代码在处理Creator数组时存在逻辑错误:

  • 在nfts.forEach循环内,每次都用nfts.map { _ in nft.creator }生成一个所有元素都是当前nft的creator的数组,然后多次追加到data中,这会导致数据大量重复且完全不符合需求。
  • 你的目标是收集所有Nft对应的Creator到一个数组,不需要遍历每个Nft重复执行添加操作。

正确实现步骤

  1. 解码得到[Nft]数组后,直接使用map方法提取每个Nft的creator属性,一步生成[Creator]数组。
  2. 如果需要将这个数组存入data([DataEnum]类型),只需追加一次.type1(creators: 生成的数组)即可,无需循环重复操作。

修正后的完整代码

func downloadJSON(completed: @escaping () -> ()) {
    guard let url = URL(string: Constants.url) else {
        print("无效URL")
        return
    }
    
    URLSession.shared.dataTask(with: url) { [self] data, response, error in
        guard let data = data, error == nil else {
            print("网络请求错误: \(error?.localizedDescription ?? "未知错误")")
            return
        }
        
        do {
            self.nfts = try JSONDecoder().decode([Nft].self, from: data)
            
            // 正确提取所有Creator到数组
            let allCreators = nfts.map { $0.creator }
            // 将整个Creator数组存入data
            self.data.append(.type1(creators: allCreators))
            
            // 保留原有的添加每个Nft到data的逻辑(如果业务需要)
            nfts.forEach { nft in
                self.data.append(.type2(nft: nft))
            }
            
            DispatchQueue.main.async {
                completed()
            }
        } catch {
            print("JSON解码错误: \(error.localizedDescription)")
        }
    }.resume()
}

enum DataEnum {
    case type1(creators: [Creator])
    case type2(nft: Nft)
}

struct Constants {
    static let url = "https://public.arx.net/~chris2/nfts.json"
}

额外优化点

  • 用guard let替代强制解包,避免因无效URL或空数据导致崩溃。
  • 细化错误信息打印,方便调试定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 14:45:33