【问题标题】:How to fetch data from nested array from API in SwiftUI?如何从 API 的嵌套数组中获取数据?
【发布时间】:2022-09-24 21:19:36
【问题描述】:

这是我的模特

进口基金会

public struct Welcome: Decodable{
    public let userslist: [Userslist]

}


public struct Userslist: Decodable, Hashable{
 public let full_name: String
    public let partner_media: [PartnerMedia]

    public init( partner_media: [PartnerMedia]) {
     

        self.partner_media = partner_media
    }
}

public struct PartnerMedia: Decodable , Hashable{
    public var id = UUID()
    public let url: String

    public init( url: String) {

        self.url = url
    }
}

这是我的模型视图。

class PublisherModelVM: ObservableObject {
    @Published var datas = [PartnerMedia]()
    
    let url = \"https://alibrary.in/api/publisherList\"
    
    init() {
        getData(url: url)
    }
    
    
    func getData(url: String) {
        guard let url = URL(string: url) else { return }
        URLSession.shared.dataTask(with: url) { (data, _, _) in
            if let data = data {
                do {
                    let results = try JSONDecoder().decode(Welcome.self, from: data)
                    DispatchQueue.main.async {

                        self.datas = results.userslist `//Cannot assign value of type \'[Userslist]\' to type \'[PartnerMedia]\' what should I write for getting proper response`
                        

                    }
                }
                catch {
                    print(error)
                }
            }
        }.resume()
    }
}

我想获取 url 和 full_name 并设置为 View

 struct PublisherListView: View{
        @StateObject var list = PublisherModelVM()
        
        var body: some View{
            ScrollView(.horizontal,showsIndicators: false){
    
                    ForEach(list.datas, id: \\.id){ item in
Text(item.full_name)
                        AsyncImage(url: URL(string: item.url)){image in
                            image
                                .resizable()
                                .frame(width: 235, height: 125).cornerRadius(8)
                            
                        }placeholder: {
                         
                                Image(systemName: \"eye\") .resizable()
                                    .frame(width: 235, height: 125).cornerRadius(8)
                           
                        }
                        
                    }
                    
                   
                }
                
                
            }
        }

这个错误显示在我的 Xcode 中无法分配类型 \'[Userslist]\' 的值 键入 \'[PartnerMedia]\'请帮我。谁能帮我推荐API相关的完整详细信息 课程,并提前感谢您

  • 根据您的模型,results.urlUserslist 的数组,datasPartnerMedia 的数组,所以您看到它们不一样,对吧?如果您有 2 个用户列表,并且每个用户列表有 3 个合作伙伴媒体,您想要一个包含 6 个合作伙伴媒体的数组吗?如果是,您可以使用flatMap() 来执行此操作,或者使用手动 for 循环从您的回复中仅检索 partnerMedias。
  • 该代码无法生成该编译错误。发布给您带来问题的实际代码。
  • self.datas = results.userslist无法将类型 \'[Userslist]\' 的值分配给类型 \'[PartnerMedia]\'@JoakimDanielson 和 @Larme 为这个错误感到抱歉。我应该在编码部分写什么请帮助我。
  • 请解决您的问题,而不是在 cmets 中发布正确的代码。除非您告诉我们您想要做什么,否则我们无法告诉您如何解决它,请再次阅读@Larme 的评论并回复它。

标签: arrays json swift


【解决方案1】:

正如我之前所说(在您已删除的问题中),请注意模型的细节以匹配 json 数据。试试这种方法,对我来说效果很好:

struct ContentView: View {
    var body: some View {
        PublisherListView()
    }
}

struct ServerResponse: Decodable {
    let userslist: [User]
}

struct User: Decodable, Identifiable {
    let id: Int
    let totalBooks: Int
    let totalfollowers: Int
    let fullAddress: String?
    let partnerMedia: [PartnerMedia]
    
    enum CodingKeys: String, CodingKey {
        case id, totalBooks,totalfollowers
        case partnerMedia = "partner_media"
        case fullAddress = "full_address"
    }
}

struct PartnerMedia: Decodable, Identifiable {
    let id: Int
    let url: String
}

struct PublisherListView: View{
    @StateObject var list = PublisherModelVM()
    
    var body: some View{
        ScrollView(.horizontal,showsIndicators: false){
            HStack(spacing:15) {
                ForEach(list.datas, id: \.id){ item in
                    AsyncImage(url: URL(string: item.url)){ image in
                        image
                            .resizable()
                            .frame(width: 235, height: 125).cornerRadius(8)
                        
                    } placeholder: {
                        Image(systemName: "eye") .resizable()
                            .frame(width: 235, height: 125).cornerRadius(8)
                    }
                }
            }
        }
    }
}

class PublisherModelVM: ObservableObject {
    @Published var datas = [PartnerMedia]()
    
    let url = "https://alibrary.in/api/publisherList"
    
    init() {
        getData(url: url)
    }
    
    func getData(url: String) {
        guard let url = URL(string: url) else { return }
        URLSession.shared.dataTask(with: url) { (data, _, _) in
            if let data = data {
                do {
                    let results = try JSONDecoder().decode(ServerResponse.self, from: data)
                    DispatchQueue.main.async {
                        for user in results.userslist {
                            self.datas.append(contentsOf: user.partnerMedia) 
                        }
                    }
                }
                catch {
                    print(error)
                }
            }
        }.resume()
    }
    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多