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