如何在 UserDefaults 中存储自定义对象?

Posted

技术标签:

【中文标题】如何在 UserDefaults 中存储自定义对象?【英文标题】:How can I store a custom object in UserDefaults? 【发布时间】:2021-08-18 17:59:03 【问题描述】:

我有一个名为 Note 的结构,它具有一些基本属性,例如 id, title, body。但我也有一个location 类型的CLLocationCoordinate2D 属性。我想用 UserDefaults 提供本地存储。因为CLLocationCoordinate2D 不符合 Codable 协议,所以我使用了 Xcode 的自动帮助,它创建了一个带有两个协议存根的扩展。看起来是这样的:

extension CLLocationCoordinate2D: Codable 
    public init(from decoder: Decoder) throws 
        <#code#>
    
    
    public func encode(to encoder: Encoder) throws 
        <#code#>
    


struct Note: Codable 
    let id: UUID
    let title: String
    let body: String
    var location: CLLocationCoordinate2D

这就是我需要帮助的地方。因为我不知道如何填补标有&lt;#code#&gt; 的空白。也许有人可以给出提示。非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

经过一番研究,我在这里找到了解决方案developer.apple.com/

extension CLLocationCoordinate2D: Codable 

  enum CodingKeys: String, CodingKey 
    case latitude
    case longitude
  

  public init(from decoder: Decoder) throws 
      self.init()
    
      let values = try decoder.container(keyedBy: CodingKeys.self)
      latitude = try values.decode(Double.self, forKey: .latitude)
      longitude = try values.decode(Double.self, forKey: .longitude)
   

  public func encode(to encoder: Encoder) throws 
      var container = encoder.container(keyedBy: CodingKeys.self)
      try container.encode(latitude, forKey: .latitude)
      try container.encode(longitude, forKey: .longitude)
  

【讨论】:

以上是关于如何在 UserDefaults 中存储自定义对象?的主要内容,如果未能解决你的问题,请参考以下文章

UserDefaults 自定义对象的自定义对象

尝试使用 NSKeyedArchiver 在 UserDefaults 中保存自定义对象

UserDefaults/KeyedArchiver 挫折

将自定义对象存储到 NSMutableArray,然后将此 NSMutableArray 存储到 NSUserDefaults

UserDefaults不保存值iphone

swift 在UserDefaults中保存自定义类