У меня есть файл JSON, структурированный так:
// MARK: - UcmData
struct UcmData: Codable, Identifiable {
let id: Int
let building: [Building]
}
// MARK: - Building
struct Building: Codable, Identifiable {
let id: Int
let title, subtitle, info, image: String
let floor: [Floor]
}
// MARK: - Floor
struct Floor: Codable, Identifiable {
let id, number: Int
let title, subtitle, image: String
let cabinet: [Cabinet]?
}
// MARK: - Cabinet
struct Cabinet: Codable, Identifiable {
let id: Int
let number: String
let person: [Person]
}
// MARK: - Person
struct Person: Codable, Identifiable {
let id: Int
let name: String
}
И мне нужно перечислить всех людей для каждой кабины inet на указанном c этаже в указанном c здании - Я пытаюсь сделать это здесь:
import SwiftUI
struct FloorDetailedView: View {
let ucmData = Bundle.main.decode(UcmData.self, from: "ucm_data.json")
let buildingId: Int?
let floorId: Int?
let floorTitle: String?
let buildingTitle: String?
init(buildingId: Int? = nil, floorId: Int? = nil, floorTitle: String? = "nil", buildingTitle: String? = "nil") {
self.buildingId = buildingId
self.floorId = floorId
self.floorTitle = floorTitle
self.buildingTitle = buildingTitle
}
var body: some View {
ScrollView {
VStack {
ForEach(ucmData.building) { building in
if (building.id == self.buildingId) {
ForEach(building.floor) { floor in
if (floor.id == self.floorId) {
ForEach(floor.cabinet) { cabinet in
Image(systemName: "house")
.cornerRadius(40)
VStack(alignment: .leading) {
Text(cabinet.name)
ForEach(cabinet.person) { person in
Text(person.name)
.font(.subheadline)
.color(.gray)
}
}
}
}
}
}
}
}
.padding(.horizontal)
.padding(.bottom)
}
.navigationBarTitle(Text(self.buildingTitle! + " - " + self.floorTitle!), displayMode: .inline)
}
}
Однако, я получаю эту ошибку Unable to type-check this expression in reasonable time
, когда я добавляю 3-й ForEach
к коду вида. Я получаю buildingId
и floorId
из предыдущего представления. Что является более эффективным способом, чтобы я мог отфильтровать кабинеты и людей и исправить эту ошибку? Спасибо.