List 从嵌套的struct swift ui创建列表

List 从嵌套的struct swift ui创建列表,list,swiftui,List,Swiftui,我正在测试IOS应用程序中的列表选择器,它允许用户选择播放列表。示例进行了编译,但预览并非预期的效果。从JSON文件中可以看到,每个集合中都有不同的数据,但在我的列表中,它似乎只选择第一个值,并根据集合的大小重复该值。我在列表中遗漏了什么,我认为语法是List(您的集合,标识符:。结构中标识符的名称)。它基本上在每个条目上打印相同的索引 [ { "id" :"1", "partyinfo": { "artwork_ur

我正在测试IOS应用程序中的列表选择器,它允许用户选择播放列表。示例进行了编译,但预览并非预期的效果。从JSON文件中可以看到,每个集合中都有不同的数据,但在我的列表中,它似乎只选择第一个值,并根据集合的大小重复该值。我在列表中遗漏了什么,我认为语法是List(您的集合,标识符:。结构中标识符的名称)。它基本上在每个条目上打印相同的索引

[
{
    "id" :"1",
"partyinfo": {
"artwork_url": "Rectangle 34",
"id": 1234,
"stream_url": "https://api.soundcloud.com/tracks/1234/stream",
"partyname": "Josh's Party",
"songs": "4 songs",
"participants":"3",
"location":"1010",
"user": {
  "avatar_url": "https://i1.sndcdn.com/avatars-large.jpg",
  "id": 12345,
  "kind": "user",
  "last_modified": "2020/09/03 14:08:25 +0000",
  "permalink": "permalink",
  "permalink_url": "https://soundcloud.com/permalink",
  "uri": "https://api.soundcloud.com/users/12345",
  "username": "Josh",
  "$$ref": "#/components/examples/UserOf/value"
}
}
},
{
    "id" :"2",
"partyinfo": {
"artwork_url": "Rectangle 35",
"id": 1234,
"stream_url": "https://api.soundcloud.com/tracks/1234/stream",
"partyname": "Alan's Party",
"songs": "4 songs",
"participants":"3",
"location":"1010",
"user": {
  "avatar_url": "https://i1.sndcdn.com/avatars-large.jpg",
  "id": 12345,
  "kind": "user",
  "last_modified": "2020/09/03 14:08:25 +0000",
  "permalink": "permalink",
  "permalink_url": "https://soundcloud.com/permalink",
  "uri": "https://api.soundcloud.com/users/12345",
  "username": "Alan",
  "$$ref": "#/components/examples/UserOf/value"
}
}
}
]
党派主义者

import SwiftUI

struct PartyList: View {

var partyInfoList: [PartyInfo]{

    var b: [PartyInfo] = []
    for n in partylist {
        b.append(n.partyinfo)
        print(n.partyinfo.partyname)
       
    }
    return b
 

}

    
var body: some View {

    
    List(partyInfoList, id: \.id){ party in
        Text(party.partyname)
    }

}
}


struct PartyList_Previews: PreviewProvider {

static var previews: some View {
    PartyList()
}
}
模型数据

import Foundation

var tracklist: [Tracklist] = load("tracklist.json")
var partylist: [Party] = load("partylist.json")

final class ModelData: ObservableObject {

//@Published var tracklist: [Tracklist] = load("tracklist.json")
//@Published var partylist: [Party] = load("partylist.json")

}

func load<T: Decodable>(_ filename: String) -> T {
let data: Data

guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
    else {
    print("error 1")
        fatalError("Couldn't find \(filename) in main bundle.")
    
}

do {
    data = try Data(contentsOf: file)
} catch {
    print("error 2")
    fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
}

do {
    let decoder = JSONDecoder()
    print("Successful")
    return try decoder.decode(T.self, from: data)
} catch {
    print("error 3")
    fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
}
}

JSON数据中的两个实体现在具有相同的
id
1234

由于您的
列表
正在使用
.id
来区分项目,因此具有重复
id
s的实体可能会发生意外情况


要解决这个问题,请确保您的实体具有唯一的
id
字段。

新手错误。谢谢!!!。您可以使用.id以外的内容进行区分吗?您可以这样做,尽管使用久经考验的
id
可能最容易。在
ForEach
列表中,您可以提供一个用作t的关键路径他id:
id:\.id
import Foundation
import SwiftUI

struct Party:Hashable, Codable {

let partyinfo: PartyInfo
}


struct PartyInfo : Hashable, Codable,  Identifiable {

var id: Int
var partyname: String
var songs: String
var participants: String
var location: String


private var artwork_url: String
var image: Image {
    getSafeImage(named: artwork_url)
}

func getSafeImage(named: String) -> Image {
   let uiImage =  (UIImage(named: named) ?? UIImage(named: "Default.png"))!
   return Image(uiImage: uiImage)
}
}