Могу ли я запросить двумерный ассоциативный массив в swift Moya?

#swift #moya

Вопрос:

Были успешно запрошены следующие два вида данных.

     {
      "ride_fare": 1000,
      "km": 7
      ]
    } 
 
 {
  "ride_fare": 1000,
  "km": 7,
  "options": [ 0, 1, 2]
}
 

Однако я не знаю, как запросить двумерный ассоциативный массив, подобный приведенному ниже.
Как я могу запросить это?

 {
  "ride_fare": 1000,
  "km": 7,
  "option_fares": [
    {
      "price": 200,
      "name": "立ち寄り",
      "id": 1
    }
  ]
}
 

Код, который я написал:

 var options = [Any]()
for option in optionFares {
    let params = [
        "id" : option.id ?? 0,
        "name" : option.name ?? "",
        "price" : option.price ?? 0
    ] as [String : Any]
    options.append(params)
}

let faresData = [
    "id" : driverOrder.id ?? 0,
    "km" : driverOrder.distance ?? 0,
    "option_fares" : options,
    "ride_fare" : driverOrder.ride_fare ?? 0
] as [String : Any]
 

Комментарии:

1. Отправляете ли вы целевой тип Moya из задачи в параметр?

2. Вы хотите использовать два верхних массива для создания нижнего массива? Или вы хотите доставить на сервер совершенно новый двумерный массив?

Ответ №1:

Во-первых, create a struct это соответствует формату json, который вы хотите запросить.

 struct Params: Codable {
    let rideFare, km: Int
    let optionFares: [OptionFare]

    enum CodingKeys: String, CodingKey {
        case rideFare = "ride_fare"
        case km
        case optionFares = "option_fares"
    }
}

struct OptionFare: Codable {
    let price: Int
    let name: String
    let id: Int
}

 

И вы должны создать параметр запроса в задаче Мойи.

 import Moya

extension APITarget: TargetType {

   var task: Task {
       case .yourCaseName(let price, let name, let id, let rideFare, let km):
            
            let encoder: JSONEncoder = JSONEncoder()
            let optionFareData: [OptionFare] = []
            optionFareData.append(OptionFare(price, name, id))
            let paramsData = Params(rideFare, km, optionFareData)
            let jsonData: Data = try! encoder.encode(paramsData)
            
            return .requestData(jsonData)
        }


   }
}