保存在userdefaults中是崩溃的应用程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了保存在userdefaults中是崩溃的应用程序相关的知识,希望对你有一定的参考价值。

我是swift的新手并试图将数组保存到userdefaults并且我的应用程序崩溃了。

我正在使用下面的代码

let currentObject = productsArray[clickedPosition] as Product
print("currentObject===(currentObject)")
var currentCartArray = [Product]()
currentCartArray.append(currentObject)

UserDefaults.standard.set(currentCartArray, forKey: "Wafaa_MyCart")
UserDefaults.standard.synchronize()

以下是我输出的内容

currentObject===Product(Id: Optional(10007), TitleEN: Optional("PDF 1"), 
                TitleAR: Optional("PDF 1 AR"), DescriptionEN: nil, 
                DescriptionAR: nil, AboutEN: Optional("Merchant 1"), 
                AboutAR: Optional("Merchant 1"), CategoryId: Optional(1), 
                UnitSold: Optional(0), CategoryEN: Optional("Category 1"), 
                CategoryAR: Optional("الفئة الأولى"), CountryId: Optional(23), 
                CountryEN: Optional("Egypt"), CountryAR: Optional("مصر"), 
                CountryFlag: Optional("http://xxxx.xxxxx.info//Files/CountryPhotos/EG-128.png"),
                 MerchantId: Optional(1), MerchantNameEN: Optional("Merchant 1"), 
                MerchantNameAR: Optional("Merchant 1"), Logo: Optional(""), 
                CurrencyId: Optional(1), CurrencyCode: Optional(414), 
                CurrencyEN: Optional("Kuwaiti Dinar"), CurrencyAR: Optional("دينار كويتى"), 
                SymbolEN: Optional("KWD"), SymbolAR: Optional("KWD"), 
                Discount: Optional("0%"), 
                FinalPrice: Optional("1.000"), Price: Optional("1.000"), 
                OverViewAR: Optional("ddddddd"), OverViewEN: Optional("dddd"), 
                NoUsersRate: Optional(0), IsFavorite: Optional(false), 
                IsPurchased: Optional(false), 
                FavoriteIds: nil, Rate: Optional(3), 
                DemoVideo: Optional("http://player.vimeo.com/video/1111"), 
                VideoDuration: Optional("06:12:00"), ViewersCount: Optional(7), 
                Photo: Optional("http://xxxx.xxxx.info//Images/noimageicon.png"), 
                AddedOnDate: Optional("28/02/2018 01:43 PM"))

这次崩溃说下面的错误

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object (
"Wafaa.Product(Id: Optional(10007), TitleEN: Optional("PDF 1"), 
    TitleAR: Optional("PDF 1 AR"), DescriptionEN: nil, DescriptionAR: nil, 
    AboutEN: Optional("Merchant 1"), AboutAR: Optional("Merchant 1"), 
    CategoryId: Optional(1), UnitSold: Optional(0), CategoryEN: Optional("Category 1"), 
    CategoryAR: Optional("U0627U0644U0641U0626U0629 U0627U0644U0623U0648U0644U0649"), 
    CountryId: Optional(23), CountryEN: Optional("Egypt"), 
    CountryAR: Optional("U0645U0635U0631"), 
    CountryFlag: Optional("http://xxx.xxxx.info//Files/CountryPhotos/EG-128.png"), 
    MerchantId: Optional(1), MerchantNameEN: Optional("Merchant 1"), 
    MerchantNameAR: Optional("Merchant 1"), Logo: Optional(""), 
    CurrencyId: Optional(1), CurrencyCode: Optional(414), 
    CurrencyEN: Optional("Kuwaiti Dinar"), 
    CurrencyAR: Optional("U062fU064aU0646U0627U0631 U0643U0648U064aU062aU0649"), 
    SymbolEN: Optional("KWD"), SymbolAR: Optional("KWD"), 
    Discount: Optional("0%"), FinalPrice: Optional("1.000"), 
    Price: Optional("1.000"), OverViewAR: Optional("ddddddd"), 
    OverViewEN: Optional("dddd"), NoUsersRate: Optional(0), 
    IsFavorite: Optional(false), IsPurchased: Optional(false), 
    FavoriteIds: nil, Rate: Optional(3), 
    DemoVideo: Optional("http://player.vimeo.com/video/xxxxx"), VideoDuration: Optional("06:12:00"), 
    ViewersCount: Optional(7), Photo: Optional("http://xxxx.xxxx.info//Images/noimageicon.png"), 
    AddedOnDate: Optional("28/02/2018 01:43 PM"))"

我记得,在Objective-C中它曾经崩溃只有我有NULL,但在这里我没有任何null,仍然为什么崩溃发生?

知道我哪里错了吗?

答案

在实际存储到Data之前,首先必须将对象序列化为UserDefaults实例。幸运的是,Swift 4提供了内置工具,可以轻松地进行序列化和反序列化(Codable协议)。

看看this tutorial,其中深入描述了所需的步骤。

另一答案

用户默认并不意味着存储您正在尝试的对象。它们用于存储数字,字符串,日期等。尝试对象类型的核心数据。

以上是关于保存在userdefaults中是崩溃的应用程序的主要内容,如果未能解决你的问题,请参考以下文章

将模型保存到 Userdefaults 会使应用程序迅速崩溃 [重复]

保存到 UserDefaults 时应用程序总是崩溃

将字典保存到 UserDefaults

iOS 13 UserDefaults:在某些设备上启动时应用程序崩溃

在 Userdefaults 中保存状态

Swift 3:将数组保存到 UserDefaults 错误 - 对象数与键数不同