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
)以确保子类不被破坏。