【问题标题】:Dictionary save error "SwiftValue encodeWithCoder:]: unrecognized selector sent to instance" [duplicate]字典保存错误“SwiftValue encodeWithCoder:]:无法识别的选择器发送到实例”[重复]
【发布时间】:2020-03-06 09:11:51
【问题描述】:

我想保存字典,但我不断收到此错误消息:“SwiftValue encodeWithCoder:]: unrecognized selector sent to instance”。这就是我尝试保存字典的方式:

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

我如何尝试加载字典:

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()
         }
     }
 }

我的结构:

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?
}

【问题讨论】:

    标签: arrays swift dictionary nsuserdefaults


    【解决方案1】:

    您可以像这样将模型保存到UserDefaults

    • 首先,您应该创建模型的实例

    • 然后你可以将你的模型保存到UserDefaults like:

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

      你可以像这样从UserDefaults获取模型

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

    我希望这是你试图找到的答案。

    享受吧!

    【讨论】:

    • 嗨,Emre Ciftci,我有一个错误:“在 'Array' 上引用实例方法 'encode' 要求 'reisdelen' 符合 'Encodable'”。你知道如何解决这个问题吗?
    • 简单地你可以遵循‘Codable’协议而不是Decodable。 “可编码”是“可编码”和“可解码”的混合体。
    猜你喜欢
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 2012-04-04
    • 1970-01-01
    相关资源
    最近更新 更多