Swift可编码和模型数组

时间:2019-05-19 06:33:16

标签: swift codable

我有一个问题,我想认为我掌握了每个基础知识,但不确定如何组合它们。

在View Controller中,我有一个基本的变量设置:

org.somepackgs.GeneralInterceptor

稍后,我发出了Alamofire请求:

var shipments = [ShipmentModel]()

如您所见,我不太确定如何将响应数据编码到我的可编码模型中,如下所述:

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的对象数组。

1 个答案:

答案 0 :(得分:1)

您可以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"
    }
}