SwiftUI: Ссылка на значения модели во вложенных необязательных массивах

#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)