1

I want to save a save a dictionary, but I keep getting this error message: "SwiftValue encodeWithCoder:]: unrecognized selector sent to instance". This is how I try to save the Dictionary:

func savePlaces(){
     let placesData = NSKeyedArchiver.archivedData(withRootObject: Resultaat?.reisdelen)
     UserDefaults.standard.set(placesData, forKey: "Reis")
}

How I try to load the dictionary:

var Reis = [reisdelen]()
func loadPlaces(){
     let placesData = UserDefaults.standard.object(forKey: "Reis") as? NSData

     if let placesData = placesData {
         let placesArray = NSKeyedUnarchiver.unarchiveObject(with: placesData as Data) as? [reisdelen]

         if let placesArray = placesArray {
             Reis = placesArray
             TableView.reloadData()
         }
     }
 }

My Struct:

struct reismogelijkheden: Decodable {
    let reisdelen: [reisdelen]?
    let reistijd: reistijd?
    let reistijdActueel : reistijdActueel?
    let aantalOverstappen: Int?
    let vertrektijd: String?
    let vertrektijdVertraging: vertrektijdVertraging?
    let aankomsttijd: String?
}

struct reisdelen: Decodable {
    let vervoerder: String?
    let richting: String?
    let treinnummer: String?
    let lijn: String?
    let stops: [stops]?
    let modaliteit: modaliteit?
    let travelTimeInMinutes: Int?
    let travelDistanceInMeters: Int?
}
Dani Kemper
  • 343
  • 2
  • 10

1 Answers1

2

You can save the model to UserDefaults like this:

  • Firstly you should create an instance of your model

  • Then you can save your model to UserDefaults like:

    let encoder = JSONEncoder()
    if let encoded = try? encoder.encode(modelInstance) {
        let defaults = UserDefaults.standard
        defaults.set(encoded, forKey: "Reis")
    }
    

    You can get model from UserDefaults like this

    if let savedItem = defaults.object(forKey: "Reis") as? Data {
        let decoder = JSONDecoder()
        if let loadedItem = try? decoder.decode(YourModel.self, from: savedItem) {
            print(loadedItem)
        }
    }
    

I hope it is the answer you try to find.

Enjoy!

emrcftci
  • 3,355
  • 3
  • 21
  • 35
  • Hi,Emre Ciftci, I have one error: "Referencing instance method 'encode' on 'Array' requires that 'reisdelen' conform to 'Encodable'". Do you know how to fix this? – Dani Kemper Nov 10 '19 at 15:12
  • Simply you can conform ‘Codable’ protocol instead of Decodable. ‘Codable’ is the mix of ‘Encodable’ and ‘Decodable’. – emrcftci Nov 10 '19 at 19:08