无法在UserDefaults中存储自定义类-尝试插入非属性列表

问题描述

我正在尝试将自定义类存储在UserDefaults中,但是一旦应用启动,我就会收到"Attempt to insert non-property list"错误。我已经成功存储了自定义类的数组,因此我遵循相同的原理,但是出了点问题。

这是我的课程:

import Foundation

public class PlanRouteFilters: NSObject,NSCoding,Codable {
    
    var favoriteLines: Bool
    var routeType: Int
    var bus: Bool
    var train: Bool
    var subway: Bool
    var electric: Bool
    var sharedCar: Bool
    var bike: Bool
    var electricScooter: Bool
    var providers: [Provider]?
    
    override init() {
        self.favoriteLines = false
        self.routeType = 1
        self.bus = false
        self.train = false
        self.subway = false
        self.electric = false
        self.sharedCar = false
        self.bike = false
        self.electricScooter = false
        self.providers = []
    }
    
    init(favLines: Bool,rType: Int,bus: Bool,train: Bool,subway: Bool,electric: Bool,sCar: Bool,bike: Bool,eScooter: Bool,providers: [Provider]?) {
        self.favoriteLines = favLines
        self.routeType = rType
        self.bus = bus
        self.train = train
        self.subway = subway
        self.electric = electric
        self.sharedCar = sCar
        self.bike = bike
        self.electricScooter = eScooter
        self.providers = providers
        
    }
    
    //MARK: NSCoding protocol methods
    public func encode(with aCoder: NSCoder){
        aCoder.encode(self.favoriteLines,forKey: "favoriteLines")
        aCoder.encode(self.routeType,forKey: "RouteType")
        aCoder.encode(self.bus,forKey: "bus")
        aCoder.encode(self.train,forKey: "train")
        aCoder.encode(self.subway,forKey: "subway")
        aCoder.encode(self.electric,forKey: "electric")
        aCoder.encode(self.sharedCar,forKey: "sharedCar")
        aCoder.encode(self.bike,forKey: "bike")
        aCoder.encode(self.electricScooter,forKey: "electricScooter")
        aCoder.encode(self.providers,forKey: "providers")
    }
    
    public required init(coder decoder: NSCoder) {
        self.favoriteLines = decoder.decodeBool(forKey: "favoriteLines")
        self.routeType = decoder.decodeInteger(forKey: "routeType")
        self.bus = decoder.decodeBool(forKey: "bus")
        self.train = decoder.decodeBool(forKey: "train")
        self.subway = decoder.decodeBool(forKey: "subway")
        self.electric = decoder.decodeBool(forKey: "electric")
        self.sharedCar = decoder.decodeBool(forKey: "sharedCar")
        self.bike = decoder.decodeBool(forKey: "bike")
        self.electricScooter = decoder.decodeBool(forKey: "electricScooter")
        self.providers = decoder.decodeObject(forKey: "providers") as? [Provider]
    }
}

这是我设置和获取对象的方式:

var planRouteFilters: PlanRouteFilters {
        get {
            var filters = PlanRouteFilters()
            let data = self.userSettings.settings.object(forKey: "planRouteFilters") as? Data
            if nil != data {
                filters = try! NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data!) as! PlanRouteFilters
            }
            return filters
        }
        set {
            let data = try! NSKeyedArchiver.archivedData(withRootObject: newValue,requiringSecureCoding: false)
            self.userSettings.settings.setValue(data,forKey: "planRouteFilters")
            self.objectWillChange.send()
        }
    }

这就是我创建userDefaults的方式:

import Foundation

struct UserSettings {
    var settings: UserDefaults
    
    init() {
        self.settings = UserDefaults.standard
        self.settings.register(
            defaults: [
                "userCity": "","showUserCityActionSheet": true,"showTutorial": 1,"initialPage": 1,"favoriteStops": [Place](),"history": [Place](),//Maximum of 10 places stored
                "notifications": [MoveMeNotification](),"planRouteFilters": PlanRouteFilters()
            ])
    }
}

如果我删除了PlanRouteFilters的默认值,则会启动该应用程序,但不会在整个应用程序中使用这些值。这是我错的地方吗?我是否应该以其他方式提供默认值?

谢谢!

我的Provider班:

public class Provider: NSObject,Codable {

    let name: String

    init(name: String) {
      self.Name = name
    }

    public func encode(with aCoder: NSCoder) {
      aCoder.encode(self.Name,forKey: "Name")
    }

    public required init(coder decoder: NSCoder) {
      self.Name = decoder.decodeObject(forKey: "Name") as! String
    }
}

更新:

好的,我无法解决此问题。但是,我认为我不需要在userSettings中使用默认值。这让我继续前进。但是,这是我的情况所特有的。对于那些没有此选项的人,请看一下 @LeoDabus答案。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)