为CoreLocation类添加Codable扩展:CLCircularRegion实现求助
实现CLCircularRegion的Codable协议支持
既然你已经搞定了CLLocationCoordinate2D的Codable扩展,那CLCircularRegion的实现就很顺了——它继承自CLRegion,所以我们需要同时处理父类和子类的所有属性。下面是完整的可运行实现:
import CoreLocation extension CLCircularRegion: Codable { // 定义编码解码需要用到的键,包含父类CLRegion的属性和自身的属性 public enum CodingKeys: String, CodingKey { case identifier case notifyOnEntry case notifyOnExit case center case radius } public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) // 先编码父类CLRegion的属性 try container.encode(identifier, forKey: .identifier) try container.encode(notifyOnEntry, forKey: .notifyOnEntry) try container.encode(notifyOnExit, forKey: .notifyOnExit) // 再编码自身的属性,center已经实现了Codable可以直接用 try container.encode(center, forKey: .center) try container.encode(radius, forKey: .radius) } public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) // 解码所有需要的属性 let identifier = try container.decode(String.self, forKey: .identifier) let notifyOnEntry = try container.decode(Bool.self, forKey: .notifyOnEntry) let notifyOnExit = try container.decode(Bool.self, forKey: .notifyOnExit) let center = try container.decode(CLLocationCoordinate2D.self, forKey: .center) let radius = try container.decode(CLLocationDistance.self, forKey: .radius) // 注意:CLCircularRegion初始化要求radius必须大于0,这里可以加个校验 guard radius > 0 else { throw DecodingError.dataCorruptedError(forKey: .radius, in: container, debugDescription: "Radius must be greater than 0") } // 调用指定初始化器创建实例 super.init(center: center, radius: radius, identifier: identifier) // 给父类的属性赋值 self.notifyOnEntry = notifyOnEntry self.notifyOnExit = notifyOnExit } }
关键说明:
- CodingKeys的设计:必须包含
CLRegion的identifier、notifyOnEntry、notifyOnExit,以及CLCircularRegion自身的center和radius,这样才能完整编码解码所有必要属性。 - 编码逻辑:按父类属性到子类属性的顺序编码,保证数据结构清晰。
- 解码逻辑:先解码所有属性值,然后校验
radius的合法性(因为CLCircularRegion不允许半径为0或负数),避免初始化失败;调用父类的指定初始化器创建实例后,再手动设置notifyOnEntry和notifyOnExit这两个父类属性。 - 依赖兼容:因为你已经实现了
CLLocationCoordinate2D的Codable扩展,所以center属性可以直接解码,不需要额外处理。
内容的提问来源于stack exchange,提问作者Jakub
相关产品推荐
相关产品推荐

