代码之家  ›  专栏  ›  技术社区  ›  Yogesh Tandel

将对象保存为用户默认值

  •  0
  • Yogesh Tandel  · 技术社区  · 6 年前

    我有下面的结构,我正在使用该结构创建一个默认对象。创建对象后,我将保存为用户默认值。但是要得到错误。请参阅下面的代码和错误。让我知道如何将此对象保存为用户默认值。

    struct FlightSearchObj {
        var FlightTripType:Int = 0
        var FlightArrObj: [FlightObj]?
        var FlightTravellers: [String : Int] = ["Adults": 1, "Child": 0, "Infants": 0]
        var FlightClass : String =  "Economy"
        var PreferredAirline : [String] = []
        var FlightFareType : String = "All"
    }
    
    struct FlightObj {
        var fromAirportObj:AirportDetail?
        var toAirportObj:AirportDetail?
        var DepartDate: String?
    }
    

    var finalOneWayRoundFlightSearchObj : FlightSearchObj?
    var finalMultiFlightSearchObj : FlightSearchObj?
    
    
    
     //DefaultObject for Flights
    finalOneWayRoundFlightSearchObj = FlightSearchObj()
    finalMultiFlightSearchObj = FlightSearchObj()
    var flightArrObj =  [FlightObj]()
    let flightObj = FlightObj()
    flightArrObj.append(flightObj)
    flightArrObj.append(flightObj)
    
    finalOneWayRoundFlightSearchObj?.FlightArrObj = flightArrObj
    finalMultiFlightSearchObj?.FlightArrObj = flightArrObj
    
    print(finalOneWayRoundFlightSearchObj?.FlightArrObj?.count ?? 0)
    print(finalMultiFlightSearchObj?.FlightArrObj?.count ?? 0)
    
    
    
    FetchOnewayRoundTripObjValues(obj:finalOneWayRoundFlightSearchObj!)
    FetchMultiCityObjValues(obj:finalMultiFlightSearchObj!)
    
    
    func FetchOnewayRoundTripObjValues(obj:FlightSearchObj){
        if (Constants.sharedInstance.defaults.value(forKey: "flightOnewayRoundTripObj") != nil){
            print("OneWay/RoundTrip Obj found - \(obj)")
        }else{
            print("OneWay/RoundTrip Obj not found")
            print(obj)
            Constants.sharedInstance.defaults.set(obj, forKey: "flightOnewayRoundTripObj")
        }
    
    
    }
    func FetchMultiCityObjValues(obj:FlightSearchObj){
        if (Constants.sharedInstance.defaults.value(forKey: "flightMultiFlightObj") != nil){
             print("MultiFlight Obj found - \(obj)")
        }else{
            print("MultiFlight Obj not found")
            Constants.sharedInstance.defaults.set(obj, forKey: "flightMultiFlightObj")
        }
    }
    

    错误 *由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“尝试插入非属性列表对象BookingApp.FlightSearchObj(FlightTripType:0,FlightArrObj:Optional([BookingApp.FlightObj(从AirportObj:nil,到AirportObj:nil,出发日期:nil)),BookingApp.FlightObj(从AirportObj:nil,到AirportObj:nil,出发日期:nil)]),航班旅行者:[“成人”:1,“儿童”:0,“婴儿”:0],航班等级:“经济舱”,首选航空公司:[],航班票价类型:“所有”)适用于关键的单程往返航班 第一次抛出调用堆栈: (0x202978ec4 0x201b49a40 0x20287f594 0x2029ab140 0x2029ab80c 0x2029ab580 0x2029ab930 0x202864408 0x2028f4908 0x2028f425c 0x202860db4 0x202863da4 0x2029b64d8 0x20333b4dc 0x103060038 0x1030644f8 0x102a56db8 0x102ADDC 0x22f6936d0 0x22f693b00 0x22F52EC2EC 0x22f600dac 0x22f602280 0x22F51037C 0x607F757B4C)0x206f07d7c 0x206f08be4 0x2029087cc 0x202903460 0x202903a00 0x2029031f0 0x204b7c584 0x22fc5abc0 0x1030fb894 0x2023c2bb4) libc++abi.dylib:以NSException类型的未捕获异常终止

    2 回复  |  直到 6 年前
        1
  •  1
  •   Chanchal Chauhan    6 年前

    确认协议 Codable 在所有要保存的结构中 UserDefaults .

    struct FlightSearchObj: Codable {
        var FlightTripType:Int = 0
        var FlightArrObj: [FlightObj]?
        var FlightTravellers: [String : Int] = ["Adults": 1, "Child": 0, "Infants": 0]
        var FlightClass : String =  "Economy"
        var PreferredAirline : [String] = []
        var FlightFareType : String = "All"
    }
    
    struct FlightObj: Codable {
        var fromAirportObj:AirportDetail?
        var toAirportObj:AirportDetail?
        var DepartDate: String?
    }
    
    struct AirportDetail: Codable {
        // Your properties
    }
    

    现在您需要保存并从中获取该对象 用户默认值 使用 PropertyListEncoder PropertyListDecoder .

    func FetchOnewayRoundTripObjValues(obj:FlightSearchObj){
        if let data = UserDefaults.standard.value(forKey:"flightOnewayRoundTripObj") as? Data {
            let res = try? PropertyListDecoder().decode(FlightSearchObj.self, from: data)
            print("OneWay/RoundTrip Obj found - \(res)")
        }else{
            print("OneWay/RoundTrip Obj not found")
            print(obj)
            UserDefaults.standard.set(try? PropertyListEncoder().encode(obj), forKey:"flightOnewayRoundTripObj")
     //            Constants.sharedInstance.defaults.set(obj, forKey: "flightOnewayRoundTripObj")
        }
    
    
    }
    func FetchMultiCityObjValues(obj:FlightSearchObj){
        if let data = UserDefaults.standard.value(forKey:"flightOnewayRoundTripObj") as? Data {
            let res = try? PropertyListDecoder().decode(FlightSearchObj.self, from: data)
            print("MultiFlight Obj found - \(res)")
        }else{
            print("MultiFlight Obj not found")
            UserDefaults.standard.set(try? PropertyListEncoder().encode(obj), forKey:"flightMultiFlightObj")
     //            Constants.sharedInstance.defaults.set(obj, forKey: "flightMultiFlightObj")
        }
    } 
    
        2
  •  0
  •   Mihir Mehta    6 年前

    对于Struct,只需将其标记为采用 Codable 协议:

    struct FlightSearchObj:Codable {
        var FlightTripType:Int = 0
        var FlightArrObj: [FlightObj]?
        var FlightTravellers: [String : Int] = ["Adults": 1, "Child": 0, "Infants": 0]
        var FlightClass : String =  "Economy"
        var PreferredAirline : [String] = []
        var FlightFareType : String = "All"
    }
    
    struct FlightObj:Codable {
        var fromAirportObj:AirportDetail?
        var toAirportObj:AirportDetail?
        var DepartDate: String?
    }
    

    也使AirportDetail可编辑。。。