Json SwiftUI ForEach循环多个阵列

Json SwiftUI ForEach循环多个阵列,json,swiftui,Json,Swiftui,我很难弄明白如何在SwiftUI中循环一些json数据的数组。我曾经从这个URL获取我的数据结构 我正在寻找类FeaturedHeaderView和FeaturedPackageView,它们的标题是“现在很热”和“我们正在使用什么”,它们也包含FeaturedPackageView数据。我的问题是我只是重复地循环第一个FeaturedHeaderView和FeaturedPackageView,我假设每个部分有两个。我的数据结构是否不正确?我还从来没有尝试过复杂的json数据,所以我不确定如何

我很难弄明白如何在SwiftUI中循环一些json数据的
数组
。我曾经从这个URL获取我的数据结构

我正在寻找类
FeaturedHeaderView
FeaturedPackageView
,它们的标题是“现在很热”和“我们正在使用什么”,它们也包含
FeaturedPackageView
数据。我的问题是我只是重复地循环第一个
FeaturedHeaderView
FeaturedPackageView
,我假设每个部分有两个。我的
数据结构是否不正确?我还从来没有尝试过复杂的json数据,所以我不确定如何正确处理它,也不确定
ForEach
循环是否是我想要的。最终的目标是要有一个
列表
,上面有“现在很热”和它的项目,然后是“我们正在使用什么”和它的项目

使用两个
ForEach
循环,我可以很好地获得
featuredBannerView
类,并认为对于其余的数据,这将是相同的方法

横幅视图正在工作

ScrollView(.horizontal){
HStack{
ForEach(self.welcome.views,id:\.viewClass){中的视图
ForEach(views.banner???[],id:\.url){banner在
ZStack(对齐:。底部引导){
GeometryReader{中的几何体
RequestImage(Url(banner.Url),动画:nil)
.aspectRatio(内容模式:.fit)
.框架(宽度:几何尺寸宽度)
.clipped()
.拐角半径(CGFloat(视图.itemCornerRadius±0))
}
HStack{
文本(banner.title??“”)
.fontWeight(.粗体)
.font(.title3)
.foregroundColor(颜色.白色)
}
.padding(.all,15)
}
.框架(宽263,高148)
}
}
}
.padding(.leading,10)
.padding(.training,10)
}
问题

我的数据结构

struct欢迎使用:Codable{
let视图:[WelcomeView]
}
结构WelcomeView:可编码{
让viewClass:字符串?
让横幅:[横幅]?
让视图:[紫色视图]?
枚举编码键:字符串,编码键{
case viewClass=“class”
案例视图
}
}
结构横幅:可编码{
让url:String?
让标题、包、名称:字符串?
}
结构PurpleView:可编码{
让viewClass:字符串?
让视图:[FluffyView]
枚举编码键:字符串,编码键{
case viewClass=“class”
案例视图
}
}
结构FluffyView:可编码{
让viewClass:字符串?
标题:字符串?
让包,包名,包作者:字符串?
让我告诉你你的名字?
让我们来看看:字符串?
枚举编码键:字符串,编码键{
case viewClass=“class”
案例标题,软件包,packageName,软件包作者,repoName,packageIcon
}
}
枚举名称:字符串,可编码{
case chariz=“chariz”
case packix=“packix”
}
列表{
ForEach(self.welcome.views,id:\.viewClass){view in
ForEach(view.views???[],id:\.viewClass){purple in
ForEach(purple.views,id:\.packageName){fluffy in
如果fluffy.viewClass==“FeaturedHeaderView”{
文本(fluffy.title??“”)
.font(.title3)
.fontWeight(.粗体)
}否则{
HStack(间距:15){
RequestImage(Url(fluffy.packageIcon??),动画:nil)
.aspectRatio(内容模式:.fit)
.框架(宽60,高60)
.clipped()
.转弯半径(13.5)
VStack(对齐:。前导){
文本(fluffy.packageName??)
.font(.body)
文本(fluffy.packageAuthor???)
.foregroundColor(颜色二级)
.font(.callout)
文本(fluffy.repoName?.rawValue??“”)
.foregroundColor(颜色二级)
.font(.subheadline)
}
}
}
}
}
}
}
.onAppear(){
请求()
}

获得重复的原因是使用
.viewClass
.packageName
作为
ForEach
循环的ID,但在JSON中,这些值实际上是唯一的<例如,code>FeaturedStackView
会被重复

如何解决这个问题: 将ID添加到模型中,并将其用于
ForEach


// MARK: - WelcomeView
struct WelcomeView: Codable {
    var id = UUID() //<-- HERE
    let viewClass: String
    let itemSize: String?
    let itemCornerRadius: Int?
    let banners: [Banner]?
    let horizontalSpacing: Int?
    let views: [PurpleView]?

    enum CodingKeys: String, CodingKey {
        case viewClass = "class"
        case itemSize, itemCornerRadius, banners, horizontalSpacing, views
    }
}

struct PurpleView: Codable {
    var id = UUID()
    let viewClass: String
    let preferredWidth: Int
    let views: [FluffyView]
    let xPadding: Int?

    enum CodingKeys: String, CodingKey {
        case viewClass = "class"
        case preferredWidth, views, xPadding
    }
}

struct FluffyView: Codable {
    var id = UUID()
    let viewClass: String
    let title: String?
    let useBoldText: Bool?
    let package, packageName, packageAuthor: String?
    let repoName: RepoName?
    let packageIcon: String?
    let orientation: String?
    let views: [TentacledView]?
    let text: String?
    let action: String?
    let yPadding: Int?

    enum CodingKeys: String, CodingKey {
        case viewClass = "class"
        case title, useBoldText, package, packageName, packageAuthor, repoName, packageIcon, orientation, views, text, action, yPadding
    }
}


//马克:欢迎光临
结构WelcomeView:可编码{
var id=UUID()//