У меня есть проблема, о которой я хотел бы думать, что у меня есть основы для каждого, но я не совсем уверен, как их объединить.
В контроллере вида у меня есть базовая настройка переменных:
var shipments = [ShipmentModel]()
Позже мне отправляется запрос Alamofire:
let shipmentSearchEndpoint: String = "https://webservices.rrts.com/TrackWebApi/api/values/123456789"
Alamofire.request(shipmentSearchEndpoint, method: .get)
.responseJSON { response in
if response.result.isSuccess{
do{
let decoder = JSONDecoder()
self.shipments = ???
}catch{
print(error)
}
self.tableView.reloadData()
}else{
print("Could not get results")
}
}
Как вы можете видетьЯ не совсем уверен, как закодировать данные ответа в мою кодируемую модель, описанную ниже:
// MARK: - PagedShipments
struct PagedShipments: Codable {
let searchResults: [ShipmentModel]
enum CodingKeys: String, CodingKey {
case searchResults = "SearchResults"
}
}
// MARK: - ShipmentModel
struct ShipmentModel: Codable {
let searchItem: String
let shipment: [ShipmentModelDetails]
let displayBOL, displayPOD, displayInvoice, displayInspection: Bool
let displayWI: Bool
enum CodingKeys: String, CodingKey {
case searchItem = "SearchItem"
case shipment = "Shipment"
case displayBOL = "DisplayBOL"
case displayPOD = "DisplayPOD"
case displayInvoice = "DisplayInvoice"
case displayInspection = "DisplayInspection"
case displayWI = "DisplayWI"
}
}
// MARK: - ShipmentModelDetails
struct ShipmentModelDetails: Codable {
let drAvail: Bool
let proNumber, pickupNumber: String
let customerNumber, bolNumber: Bool?
let bolReceived, podReceived: Bool
let poNumber: Bool?
let orderNumber, operationalStatus, status: String
let inspectionAvailable: Bool
let proDateTime, deliverDateTime: String
let specInst1, specInst2, specInst3, scac: Bool?
let location, dest, manifest: Bool?
let billToAccount: String
let pieces, weight: Int
let apptDateTime, deliveredDateTime, projectedDeliveryDateTime: String
let hawb: Bool?
let origin, consignee: Consignee
let pickupTerminal: PickupTerminal
let comments: [Comment]
let position: Int?
let referenceNumbers: [String]
let schedArriveEarly, schedArriveLate, actualDeparture, orderDate: String
let pickedUp: Bool
enum CodingKeys: String, CodingKey {
case drAvail = "DRAvail"
case proNumber = "ProNumber"
case pickupNumber = "PickupNumber"
case customerNumber = "CustomerNumber"
case bolNumber = "BOLNumber"
case bolReceived = "BOLReceived"
case podReceived = "PODReceived"
case poNumber = "PONumber"
case orderNumber = "OrderNumber"
case operationalStatus = "OperationalStatus"
case status = "Status"
case inspectionAvailable = "InspectionAvailable"
case proDateTime = "ProDateTime"
case deliverDateTime = "DeliverDateTime"
case specInst1 = "SpecInst1"
case specInst2 = "SpecInst2"
case specInst3 = "SpecInst3"
case scac = "Scac"
case location = "Location"
case dest = "Dest"
case manifest = "Manifest"
case billToAccount = "BillToAccount"
case pieces = "Pieces"
case weight = "Weight"
case apptDateTime = "ApptDateTime"
case deliveredDateTime = "DeliveredDateTime"
case projectedDeliveryDateTime = "ProjectedDeliveryDateTime"
case hawb = "HAWB"
case origin = "Origin"
case consignee = "Consignee"
case pickupTerminal = "PickupTerminal"
case comments = "Comments"
case position = "Position"
case referenceNumbers = "ReferenceNumbers"
case schedArriveEarly = "SchedArriveEarly"
case schedArriveLate = "SchedArriveLate"
case actualDeparture = "ActualDeparture"
case orderDate = "OrderDate"
case pickedUp = "PickedUp"
}
}
// MARK: - Comment
struct Comment: Codable {
let activityCode: String?
let statusComment, statusDateTime: String
let status, reason: String?
enum CodingKeys: String, CodingKey {
case activityCode = "ActivityCode"
case statusComment = "StatusComment"
case statusDateTime = "StatusDateTime"
case status = "Status"
case reason = "Reason"
}
}
// MARK: - Consignee
struct Consignee: Codable {
let name, address1, address2, city: String
let state, postalCode: String
enum CodingKeys: String, CodingKey {
case name = "Name"
case address1 = "Address1"
case address2 = "Address2"
case city = "City"
case state = "State"
case postalCode = "PostalCode"
}
}
// MARK: - PickupTerminal
struct PickupTerminal: Codable {
let terminalName, terminalTollFreePhone: String
enum CodingKeys: String, CodingKey {
case terminalName = "TerminalName"
case terminalTollFreePhone = "TerminalTollFreePhone"
}
}
Из приведенной выше конечной точки вы можете получить образец данных.По сути, «корень» помечен как SearchResults
, а под ним находится массив объектов, которые я называю ShipmentModel(s)
.