我需要将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
是只读属性,我无法以相同的方式创建它们。另一个问题是为什么我能够在public init
中创建CLLocationCoordinate2D
并在Codable
中创建CLCircularRegion
扩展我得到错误:
我看到了公众的观点,但是要求吗?当然required
将失败beacouse它的扩展而不是一个类。所以这个问题的一个解决方案是创建抽象类,它将包含初始化器中的所有字段和构建区域我知道,但是还有其他方法可以将Codable
扩展到Apple不支持的现有类吗?
受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
的情况下,你还需要以类似的方式保存radius
和center
。
我将CLCircularRegion移动到计算变量,它现在自动与Codable一起使用:
var region: CLCircularRegion { return CLCircularRegion(center: self.coordinates, radius: 10.0, identifier: identifier) }