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

Swift:如何从Data.swift在ProductList视图中展示API返回数据?

在ProductList.swift中展示数据的步骤

1. 创建数据管理类(可放在data.swift或单独文件)

先写一个遵循ObservableObject的类来处理数据获取与状态管理,让视图能自动响应数据变化:

import Foundation
import Combine

class ProductDataManager: ObservableObject {
    @Published var products: [Search] = [] // 替换为你的产品模型数组类型
    @Published var isLoading = false
    @Published var error: Error? = nil
    
    func fetchProducts() {
        isLoading = true
        error = nil
        
        guard let url = URL(string: "你的Rapid-Api请求URL") else {
            error = NSError(domain: "", code: -1, userInfo: [NSLocalizedDescriptionKey: "无效URL"])
            isLoading = false
            return
        }
        
        var request = URLRequest(url: url)
        request.addValue("你的Rapid-Api Key", forHTTPHeaderField: "X-RapidAPI-Key")
        request.addValue("你的Rapid-Api Host", forHTTPHeaderField: "X-RapidAPI-Host")
        // 根据API要求添加其他请求头或参数
        
        URLSession.shared.dataTask(with: request) { [weak self] data, response, error in
            DispatchQueue.main.async {
                self?.isLoading = false
                if let error = error {
                    self?.error = error
                    return
                }
                
                guard let data = data else {
                    self?.error = NSError(domain: "", code: -2, userInfo: [NSLocalizedDescriptionKey: "无返回数据"])
                    return
                }
                
                do {
                    let decodedResponse = try JSONDecoder().decode(Response.self, from: data)
                    // 根据你的结构体层级调整取值路径,比如decodedResponse.data.search
                    self?.products = decodedResponse.data.search
                } catch let decodingError {
                    self?.error = decodingError
                    print("解析失败:\(decodingError)")
                }
            }
        }.resume()
    }
}

2. 在ProductList视图中使用数据管理器

在视图里初始化数据管理器,监听数据状态并展示对应UI:

import SwiftUI

struct ProductList: View {
    @StateObject private var dataManager = ProductDataManager() // Xcode12.4支持iOS14+,用@StateObject
    
    var body: some View {
        NavigationView {
            Group {
                if dataManager.isLoading {
                    ProgressView("加载中...")
                } else if let error = dataManager.error {
                    Text("加载失败:\(error.localizedDescription)")
                        .foregroundColor(.red)
                } else if dataManager.products.isEmpty {
                    Text("暂无产品数据")
                } else {
                    List(dataManager.products) { product in
                        // 根据你的Search结构体属性自定义展示内容
                        VStack(alignment: .leading) {
                            Text(product.name)
                                .font(.headline)
                            Text("价格:\(product.price)")
                                .font(.subheadline)
                                .foregroundColor(.gray)
                            // 添加其他需要展示的字段
                        }
                    }
                }
            }
            .navigationTitle("产品列表")
            .onAppear {
                dataManager.fetchProducts() // 视图出现时触发数据请求
            }
        }
    }
}

// 注意:你的Search结构体需要遵循Identifiable协议,否则List无法直接遍历
// 示例修改data.swift中的Search结构体:
// struct Search: Decodable, Identifiable {
//     let id: String // 替换为你模型中的唯一标识字段,比如productId
//     // 其他属性...
// }
// 若没有现成唯一标识,可在List中手动指定id:List(dataManager.products, id: \.self) { ... }(需Search遵循Equatable)

3. 关键注意事项

  • 确保Search结构体遵循Identifiable协议,或在List中手动指定唯一标识,否则无法正常遍历展示。
  • 数据解析时要严格匹配Response、Data、Search的结构体层级,避免因路径错误导致无法获取产品数据。
  • 网络请求必须携带Rapid-Api要求的X-RapidAPI-Key和X-RapidAPI-Host请求头,否则会返回权限错误。
  • 异步请求完成后,必须在主线程更新UI状态,代码中已通过DispatchQueue.main.async处理,避免UI异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:58:03