CoreLocation 的 Codable 扩展 类

Codable extension to CoreLocation classes

我需要将 Codable 添加到两个 class。一个是 CLLocationCoordinate2D,第二个是 CLCircularRegion

我对 CLLocationCoordinate2D 没有意见,这样做是可行的:

extension CLLocationCoordinate2D: Codable {
    public enum CodingKeys: String, CodingKey {
        case latitude
        case 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)
        }

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

但是我在尝试用 CLCircularRegion 做同样的事情时遇到了很多问题。由于 radiuscenter 是只读属性,我无法真正以相同的方式创建它们。另一个问题是为什么我能够在 CLLocationCoordinate2D 中创建 public init 并在 CLCircularRegion 中创建 Codable 扩展我收到错误:

我明白了 public 的要点,但这是必需的吗?当然 required 会失败,因为它是扩展名而不是 class。因此,针对此问题的一种解决方案是创建抽象 class,它将包含所有字段并在初始化程序中构建区域,我知道,但是还有其他方法可以将 Codable 扩展到现有的 class Apple 还不支持吗?

我将 CLCircularRegion 移动到计算变量,它现在自动与 Codable 一起工作:

var region: CLCircularRegion { return CLCircularRegion(center: self.coordinates, radius: 10.0, identifier: identifier) }

受到 的启发,我通过以 Double 格式存储在对象中的纬度和经度解决了我的问题。 CLLocation 然后作为计算 属性 返回,读取两个存储值:

private var latitude: Double = 0.0
private var longitude: Double = 0.0    

var location: CLLocation {
    return CLLocation(latitude: latitude, longitude: longitude)
}

对于 CLCircularRegion 的情况,您还需要以类似的方式保存 radiuscenter