ios - 将对象保存为用户默认值
问题描述
我有下面的结构,我正在使用结构创建一个默认对象。创建对象后,我将保存为用户默认值。但得到错误。请参阅下面的代码和错误。让我知道如何将此对象保存为用户默认值。
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(fromAirportObj: nil, toAirportObj: nil, DepartDate: nil), BookingApp.FlightObj(fromAirportObj: nil, toAirportObj: nil, DepartDate: nil)]), FlightTravellers: ["Adults": 1, "Child": 0, "Infants": 0], FlightClass: "Economy", PreferredAirline: [], FlightFareType: "All") for key flightOnewayRoundTripObj' *First throw call stack: (0x202978ec4 0x201b49a40 0x20287f594 0x2029ab140 0x2029ab80c 0x2029ab580 0x2029ab930 0x202864408 0x2028f4908 0x2028f425c 0x202860db4 0x202863da4 0x2029b64d8 0x20333b4dc 0x103060038 0x1030644f8 0x102a56db8 0x102adcadc 0x102add8cc 0x22f6936d0 0x22f693b00 0x22f5ec2ec 0x22f600dac 0x22f602280 0x22f5e4470 0x23010373c 0x206f75b74 0x206f7ab2c 0x206ed944c 0x206f07d7c 0x206f08be4 0x2029087cc 0x202903460 0x202903a00 0x2029031f0 0x204b7c584 0x22fc5abc0 0x1030fb894 0x2023c2bb4) libc++abi .dylib:以 NSException 类型的未捕获异常终止
解决方案
确认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
}
现在您需要UserDefaults
使用PropertyListEncoder
and保存并获取该对象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")
}
}
推荐阅读
- java - Vaadin 中当前 UI 的访问方法
- java - 为什么 appium 停止在反应原生 android 应用程序中查找元素?
- c# - 当我编辑控件集合时,如何将控件添加到我的 UserControl?
- ios - OpenGL ES 错误:在没有完整 mip 链的情况下启用 Mipmapping
- php - 将具有特定键的数组元素移动到数组的开头
- css - 使用 Webpack 和 React 加载 CSS
- excel - Excel:匹配 2 个项目,包括日期是否在多个工作表上的日期范围之间
- r - 在 R 和 Rapidminer 中使用 H2O 3.8.2.6 的 GBT 算法
- azure - Azure 数据工厂活动副本:使用 @pipeline().TriggerTime 评估接收器表中的列
- c# - 在 C# 中运行测试方法时,抛出线程被 Aborted 异常