CoreLocation类的可编码扩展

问题描述 投票:3回答:2

我需要将Codable添加到两个类中。一个是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是只读属性,我无法以相同的方式创建它们。另一个问题是为什么我能够在public init中创建CLLocationCoordinate2D并在Codable中创建CLCircularRegion扩展我得到错误:

enter image description here

我看到了公众的观点,但是要求吗?当然required将失败beacouse它的扩展而不是一个类。所以这个问题的一个解决方案是创建抽象类,它将包含初始化器中的所有字段和构建区域我知道,但是还有其他方法可以将Codable扩展到Apple不支持的现有类吗?

ios swift core-location codable
2个回答
3
投票

Artem answer启发,我通过以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


1
投票

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

var region: CLCircularRegion { return CLCircularRegion(center: self.coordinates, radius: 10.0, identifier: identifier) }
© www.soinside.com 2019 - 2024. All rights reserved.