如何在 UserDefaults 中存储自定义对象?
How can I store a custom object in UserDefaults?
我有一个名为 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
}
这就是我需要帮助的地方。因为我不知道如何填补标有<#code#>
的空白。也许有人可以给个提示。非常感谢任何帮助。
经过一些研究,我在这里找到了解决方案 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)
}
}
我有一个名为 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
}
这就是我需要帮助的地方。因为我不知道如何填补标有<#code#>
的空白。也许有人可以给个提示。非常感谢任何帮助。
经过一些研究,我在这里找到了解决方案 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)
}
}