如何解决Swift解码和编码自定义类型
我很难在Swift中解码和编码我的一个类。我尝试遵循Encoding and Decoding Custom Types文档,但没有运气。
我的课程布局如下:
public struct MapLocation: Identifiable,Codable {
@DocumentID public var id: String?
let originLocation: [MapLandmark]
let destinationLocation: [MapLandmark]
enum CodingKeys: String,CodingKey {
case originLocation
case destinationLocation
}
}
import Foundation
import MapKit
struct MapLandmark: Codable {
let placemark: MKPlacemark
var id: UUID {
return UUID()
}
var name: String {
self.placemark.name ?? ""
}
var title: String {
self.placemark.title ?? ""
}
var coordinate: CLLocationCoordinate2D {
self.placemark.coordinate
}
}
我尝试从上面的链接中添加编码和解码类,但始终遇到错误。实施解决方案的最佳方法是什么?
编辑: 我忘了提到我得到的错误:
“类型'MapLandmark'不符合协议'可解码'”
“类型'MapLandmark'不符合协议'可编码'
解决方法
MKPlacemark
符合NSSecureCoding
。您可以只使用NSKeyedArchiver
和NSKeyedUnarchiver
对其进行编码/解码。 UUID
已符合Codable
。请尝试以下操作:
import MapKit
extension NSSecureCoding {
func archived() throws -> Data {
try NSKeyedArchiver.archivedData(withRootObject: self,requiringSecureCoding: false)
}
}
extension Data {
func unarchived<T: NSSecureCoding>() throws -> T? {
try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(self) as? T
}
}
struct MapLandmark: Codable {
let placemark: MKPlacemark
let id: UUID
func encode(to encoder: Encoder) throws {
var unkeyedContainer = encoder.unkeyedContainer()
try unkeyedContainer.encode(placemark.archived())
try unkeyedContainer.encode(id)
}
public init(from decoder: Decoder) throws {
var container = try decoder.unkeyedContainer()
placemark = try container.decode(Data.self).unarchived()!
id = try container.decode(UUID.self)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。