Ios CoreLocation类的可编码扩展

Ios CoreLocation类的可编码扩展,ios,swift,core-location,codable,Ios,Swift,Core Location,Codable,我需要在两个类中添加Codable。一个是CLLocationCoordinate2D,第二个是CLCircularRegion 我对CLLocationCoordinate2D没有异议,它通过这样做工作: extension CLLocationCoordinate2D: Codable { public enum CodingKeys: String, CodingKey { case latitude case longitude }

我需要在两个类中添加
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
做同样的事情时遇到了很多问题。由于
radius
center
是只读属性,因此我无法以相同的方式创建它们。另一个问题是为什么我能够在
CLLocationCoordinate2D
中创建
public init
,并在
CLCircularRegion
中创建
Codable
扩展,我遇到了错误:


我明白公开的意义,但需要吗?当然,
required
会失败,因为它不是一个类的扩展。所以这个问题的一个解决方案是创建一个抽象类,它将包含初始化器中的所有字段和build region,我知道,但是还有其他方法可以将
Codable
扩展到苹果还不支持的现有类吗?

我将CLCircularRegion移动到computed变量,它现在可以自动使用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
的情况下,您还需要以类似的方式保存
radius
center

我需要将Codable添加到两个类中。这对
CLLocationCoordinate2D
有效,但对
CLCircularRegion
无效的原因是
CLLocationCoordinate2D
是一个结构而不是一个类。结构可以在扩展中有初始值设定项,因为没有继承
CLCircularRegion
不过是一个类。类在扩展中只能有方便的初始值设定项(调用
self.init
)以确保子类不被破坏。