无法让 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 循环中设置切换状态