微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift解码和编码自定义类型

如何解决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。您可以只使用NSKeyedArchiverNSKeyedUnarchiver对其进行编码/解码。 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 举报,一经查实,本站将立刻删除。