Swift Codable и Model Array - PullRequest
       2

Swift Codable и Model Array

0 голосов
/ 19 мая 2019

У меня есть проблема, о которой я хотел бы думать, что у меня есть основы для каждого, но я не совсем уверен, как их объединить.

В контроллере вида у меня есть базовая настройка переменных:

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

1 Ответ

1 голос
/ 19 мая 2019

Вы можете decode, как показано ниже,

do{
    let result = try JSONDecoder().decode(PagedShipments.self, from: response.data!)
    self.shipments = result.searchResults
    print(shipments.first?.shipment.actualDeparture)
} catch{
    print(error)
}

В модели ShipmentModel вам необходимо изменить тип shipment с Array на object, как показано ниже,

struct ShipmentModel: Codable {
    var searchItem: String
    var shipment: ShipmentModelDetails
    var displayBOL, displayPOD, displayInvoice, displayInspection: Bool
    var 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"
    }
}
...