#swift #swiftui
#быстрый #свифтуи
Вопрос:
В представлении моего приложения я пытаюсь перечислить значения массива внутри другого массива. Массивы заполняются с помощью JSON из вызова API. Оба массива являются дополнительными. Сначала я проверяю, содержит ли массив нулевое значение. В данном случае я знаю, что это не ноль.
Я получаю сообщение об ошибке, что «Значение типа» [Ландшафт]» не содержит элемента «мульчирование» «
Вот применимая часть JSON, которая присутствует:
"projectType": { "landscapes": [ { "id": 6, "types": [ "mulching", "clearing", "planting", "treeCare", "other" ], "mulching": { "id": 1, "mulchingType": "Create new mulch beds", "currentlyInPlace": "Grass / Weeds", "currentlyInPlaceCustom": "", "roomLength": "20", "roomWidth": "4", "color": "Black", "customColor": "", "length": "", "approximateLength": "" } } }
Моя модель структурирована следующим образом:
// MARK: - ProjectType struct ProjectType: Codable { let landscapes: [Landscape]? let generalConstructions: [GeneralConstruction]? } // MARK: - Landscape struct Landscape: Codable { let id: Int let types: [String] let mulching: Mulching? let clearing: Clearing? let planting: Planting? let treeCare: TreeCare? let other: Other? } // MARK: - Mulching struct Mulching: Codable { let id: Int let mulchingType, currentlyInPlace, currentlyInPlaceCustom, roomLength: String let roomWidth, color, customColor, length: String let approximateLength: String }
Вот где я сталкиваюсь с ошибкой:
import SwiftUI struct LandscapeSpecificsView: View { let projectType: ProjectType var body: some View { VStack{ if let landscapes = projectType.landscapes { if landscapes.contains(where: {$0.mulching != nil}) { Text( "(landscapes.mulching)" **ERROR HERE** ) } } } } }
Как я могу ссылаться на значения модели мульчирования, такие как mulching.id, мульчирование.тип мульчирования, мульчирование.цвет и т.д.?
Комментарии:
1. Вы должны перебрать коллекцию
landscapes
— ошибка говорит вам, что сейчас это массив, а не один экземпляр. Может быть, вы ищетеForEach
? Или, может быть, вы просто хотите показать один из них?2. @jnpdx спасибо. Это сработало, когда я применил функциональность ForEach.
Ответ №1:
Повторяя @jnpdx
сказанное, в вашем коде landscapes
есть массив ландшафта, и каждый элемент содержит мульчирование, но не сам массив. Вы могли бы попробовать что-то вроде этого: (сделать мульчирование структуры идентифицируемым)
struct LandscapeSpecificsView: View { let projectType: ProjectType var body: some View { VStack{ if let landscapes = projectType.landscapes, let mulchings = landscapes.compactMap{$0.mulching} { ForEach(mulchings) { mulch in Text(mulch.mulchingType) } } } } }
Комментарии:
1. Спасибо! Я попробовал решение выше вашего, но оно очень похоже на то, что я применил.
2. @JohnGerard лучше использовать ключевой путь здесь
.compactMap(.mulching)