Swift技术问题:如何将API返回的Nft Struct中Creator数据存入数组
正确提取NFT中Creator数据到数组的方法
原代码问题分析
你当前的代码在处理Creator数组时存在逻辑错误:
- 在
nfts.forEach循环内,每次都用nfts.map { _ in nft.creator }生成一个所有元素都是当前nft的creator的数组,然后多次追加到data中,这会导致数据大量重复且完全不符合需求。 - 你的目标是收集所有Nft对应的Creator到一个数组,不需要遍历每个Nft重复执行添加操作。
正确实现步骤
- 解码得到
[Nft]数组后,直接使用map方法提取每个Nft的creator属性,一步生成[Creator]数组。 - 如果需要将这个数组存入
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
相关产品推荐
相关产品推荐

