无法让 ForEach 循环在 SwiftUI 中使用嵌套的 JSON 数据运行 [关闭]

Posted

技术标签:

【中文标题】无法让 ForEach 循环在 SwiftUI 中使用嵌套的 JSON 数据运行 [关闭]【英文标题】:Can't get ForEach loop to function with nested JSON data in SwiftUI [closed] 【发布时间】:2022-01-21 16:30:42 【问题描述】:

我正在尝试使用ForEach 在我的服务模型数据中的联系人上创建一个列表。

型号如下;

struct ServiceContract: Codable, Identifiable 
    let id: String
    let name: String
    let latitude: Double
    let longitude: Double
    let maplogo: String
    let customerName: String
    let postcode: String
    let serviceCompany: String
    let projectNumber: Int
    let renewalDate: String
    let contractTerm: Int
    let annualValue: Double
    let paymentTerms: String
    let relationship: String
    let geuOEM: String
    let additionalSpendToDate: Double
    let type: String
    let contacts: Contacts
    let service: [String]
    let notes: String
    
    // Computer Property
    var location: CLLocationCoordinate2D 
        CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
    


struct Contacts: Codable 
    let contact: [Contact]


struct Contact: Codable 
    let contactFirstName: String
    let contactLastName: String
    let contactNumber: String
    let contactEmailAddress: String

所以基本上每个服务合同(确实符合Identifiable)可以有多个联系人。这是通过使用几个额外的结构来实现的。

所以问题。我想简单地为特定服务合同创建每个联系人的列表,但我无法让ForEach 发挥作用,因为使用\.id 不起作用,我不能使用serviceContract.contacts.contact 作为这个不符合Identifiable

以下代码摘录:

VStack 
    ForEach(serviceContract.contacts.contact)  cont in
        Text("\(cont.contactFirstName)")
     //: LOOP

【问题讨论】:

您能否使Contact 符合Identifiable,例如使用contactNumber 作为id 更简单的方法可能是在 ForEach 初始化程序中提供一个 id 参数。 【参考方案1】:

serviceContract.contacts 中的每个联系人都必须是唯一的。如果contactNumber 是唯一的,那么您可以这样做

ForEach(serviceContract.contacts.contact, id: \.self.contactNumber)

如果Contact 中没有一个字段是唯一的,那么您可以使整个Contact 符合Hashable(这将需要一些额外的代码),然后使用整个Contact 实例作为标识符:

ForEach(serviceContract.contacts.contact, id: \.self)

【讨论】:

非常感谢您的回答和及时回复。

以上是关于无法让 ForEach 循环在 SwiftUI 中使用嵌套的 JSON 数据运行 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 如何让 ForEach 循环根据 Picker 中选定月份的天数进行迭代

SwiftUI 中按钮操作内的 ForEach 循环?

如何在 SwiftUI 的 foreach 循环中设置切换状态

SwiftUI:如何根据 Picker 的值更新 ForEach 循环的范围

SwiftUI 将几何阅读器与 ForEach 结合使用

SwiftUI ForEach.onDelete 在 TabView 中无法正常工作